Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用fork()和execl()创建两个子进程_C++_C_Linux_Fork_Exec - Fatal编程技术网

C++ 使用fork()和execl()创建两个子进程

C++ 使用fork()和execl()创建两个子进程,c++,c,linux,fork,exec,C++,C,Linux,Fork,Exec,我正在尝试fork()一个进程,并让它执行ffmpeg屏幕录制(使用SIGINT停止)。 我编写了一个popen2()函数,它forks()然后调用execl(),如下所示。但是使用这个我不能杀死fork'ed进程,因为我在ps中看到了2个子进程 4508 744 pts/0 S+ 12:53 0:00 sh -c ffmpeg -video_size 1024x768 -framerate 20 -f x11grab -i :0.0 abcd.mp4 1883

我正在尝试fork()一个进程,并让它执行ffmpeg屏幕录制(使用SIGINT停止)。 我编写了一个popen2()函数,它forks()然后调用execl(),如下所示。但是使用这个我不能杀死fork'ed进程,因为我在ps中看到了2个子进程

4508   744 pts/0    S+   12:53   0:00 sh -c ffmpeg -video_size 1024x768 -framerate 20 -f x11grab -i :0.0 abcd.mp4      
1883  696608 pts/0  Rl+  12:53   0:52 ffmpeg -video_size 1024x768 -framerate 20 -f x11grab -i :0.0 abcd.mp4
这是我正在使用的popen2()函数,它返回fork'ed进程的PID

pid_t popen2()
{
  const pid_t pid = fork();
  if (pid == 0)
  {
    execl("ffmpeg", "-video_size 1024x768 -framerate 20 -f x11grab -i : 0.0", NULL);
    exit(1);
  }
  // parent process.
  return pid;
}
会话结束后,我会在父进程中杀死它

const auto wait_result = waitpid(screen_recorder_pid_, &status, WNOHANG);
// child is still running, kill.
if (wait_result == 0)
{
  const auto kill_result = kill(screen_recorder_pid_, SIGINT);
}
我的问题是

  • 为什么要创建2个子流程?我认为使用execl应该取代当前的程序
  • 如何从父进程终止进程

  • ffmpeg
    是shell脚本还是缺少可执行权限?如果您尝试:
    execl(“ffmpeg”,“ffmpeg”,“视频大小”,“1024x768”,“帧速率”,“20”,“f”,“x11grab”,“i”,“0.0”,NULL),该怎么办?(而且
    真的应该从
    0.0
    -
    i
    ?)中分离出来吗?@Alan
    ffmpeg
    是一个二进制可执行文件,而不是shell脚本。@kode18“我如何从父进程中终止进程?”使用
    SIGKILL
    ,而不是
    SIGINT
    @πάταῥεῖ 通常是的,没有什么可以阻止您创建名为
    ffmpeg
    的shell脚本,然后调用可执行文件