自己写了一个程序,实现以守护进程来执行指定的命令,并且返回该守护进程的pid。

2013-09-17 11:03:27 +08:00
 ety001
最近在做一个东西,需要用php去调用ffmpeg,但是问题在于如果ffmpeg不能立即结束(比如进行一个流处理),那么php就一直在等待exec的返回。

为了解决这个问题,之前用的方法是把ffmpeg的执行结果输出到/dev/null,然后再加上&让其后台执行,pid是靠grep进程列表找到执行的命令,但是这个方法总感觉不是很可靠,因为grep的时候,关键字多一个空格,就找不到pid了。

现在自己写了一个C程,让C程来执行ffmpeg,同时返回ffmpeg的进程id。由于平时很少写C,还请各位帮看看有什么安全隐患。另外有其他的方法,大家可以一起讨论下~

代码地址:https://github.com/ety001/mytools/blob/master/daemonRun/daemonRun.c

PS:表示不知道怎么把github的代码贴进来。。
5535 次点击
所在节点    程序员
11 条回复
lqs
2013-09-17 12:07:25 +08:00
可以用 glibc 里的 daemon(3) 来代替你自己写的 init_daemon 函数。
missdeer
2013-09-17 12:20:17 +08:00
为毛要自己写,Linux上有daemonize小工具,-p参数把pid写入到文件中
ety001
2013-09-17 13:23:13 +08:00
@missdeer 显然我不是专业写C的。。
hfcorriez
2013-09-17 14:17:51 +08:00
这基本用不到c,PHP有很多种方法可以实现,看看php-childprocess应该可以满足你的需求 https://github.com/hfcorriez/php-childprocess/
wudikua
2013-09-17 14:23:59 +08:00
pcntl_fork 我想可以满足你想要的。
ety001
2013-09-17 15:54:10 +08:00
@hfcorriez 膜拜,有时间的时候,一定要仔细看看
ety001
2013-09-17 15:55:50 +08:00
@wudikua 刚才测试了一下,貌似只能得到调用ffmpeg的php进程的pid,拿不到ffmpeg的。

代码如下:
$c = 'ffmpeg -y -f video4linux2 -s 320*240 -r 10 -i /dev/video0 test.avi';
$pid = pcntl_fork();

if($pid == -1){
die('-1');
} else if($pid){
echo $pid;
return;
} else {
exec($c);
}
hfcorriez
2013-09-17 17:28:46 +08:00
完全没必要

exec('ffmpeg -y -f video4linux2 -s 320*240 -r 10 -i /dev/video0 test.avi >/dev/null 2>1 & echo $!');
ety001
2013-09-17 17:56:33 +08:00
@hfcorriez Thanks!
labasq
2017-07-31 08:54:40 +08:00
@hfcorriez
这个是 Linux 下的,Windows 的不支持
xttzzxq
2018-12-06 15:46:28 +08:00
@hfcorriez 不错比较简洁可用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/82760

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX