V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ety001
V2EX  ›  程序员

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

  •  
  •   ety001 ·
    ety001 · 2013-09-17 11:03:27 +08:00 · 5694 次点击
    这是一个创建于 4077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在做一个东西,需要用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的代码贴进来。。
    11 条回复    2018-12-06 15:46:28 +08:00
    lqs
        1
    lqs  
       2013-09-17 12:07:25 +08:00   ❤️ 1
    可以用 glibc 里的 daemon(3) 来代替你自己写的 init_daemon 函数。
    missdeer
        2
    missdeer  
       2013-09-17 12:20:17 +08:00   ❤️ 2
    为毛要自己写,Linux上有daemonize小工具,-p参数把pid写入到文件中
    ety001
        3
    ety001  
    OP
       2013-09-17 13:23:13 +08:00
    @missdeer 显然我不是专业写C的。。
    hfcorriez
        4
    hfcorriez  
       2013-09-17 14:17:51 +08:00   ❤️ 1
    这基本用不到c,PHP有很多种方法可以实现,看看php-childprocess应该可以满足你的需求 https://github.com/hfcorriez/php-childprocess/
    wudikua
        5
    wudikua  
       2013-09-17 14:23:59 +08:00   ❤️ 1
    pcntl_fork 我想可以满足你想要的。
    ety001
        6
    ety001  
    OP
       2013-09-17 15:54:10 +08:00
    @hfcorriez 膜拜,有时间的时候,一定要仔细看看
    ety001
        7
    ety001  
    OP
       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
        8
    hfcorriez  
       2013-09-17 17:28:46 +08:00   ❤️ 1
    完全没必要

    exec('ffmpeg -y -f video4linux2 -s 320*240 -r 10 -i /dev/video0 test.avi >/dev/null 2>1 & echo $!');
    ety001
        9
    ety001  
    OP
       2013-09-17 17:56:33 +08:00
    @hfcorriez Thanks!
    labasq
        10
    labasq  
       2017-07-31 08:54:40 +08:00
    @hfcorriez
    这个是 Linux 下的,Windows 的不支持
    xttzzxq
        11
    xttzzxq  
       2018-12-06 15:46:28 +08:00
    @hfcorriez 不错比较简洁可用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5779 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.