我使用以下系统命令来调用我的c程序ffmpeg:
system("ffmpeg -t 10 -f video4linux2 -s 640x480 -r 30 -i /dev/video0 -f mp4 /home/somepath/webcam.mp4");
system("ffmpeg -i /home/somepath/webcam.mp4 -r 1 -s 640x480 -f image2 foo-%03d.jpeg");
问题是我需要在第一个系统在10秒后完成第二个系统后调用。我能想到的唯一方法是使用thread.sleep()然后调用它。有没有其他更优雅的方法来实现同样的目标?
答案 0 :(得分:4)
阅读一本好书,如advanced linux programming或advanced unix programming。
您将了解到基本流程创建和程序执行与fork(2),execve(2),waitpid(2)和相关syscalls相关。
实际上,system(3)
由fork
实现execve
/bin/sh
-c
,waitpid
或wait
。
你绝对可以自己做fork
和execve
。您可能还想处理SIGCHLD信号。您不需要任何线程相关的调用。您可能会对pipe(2),dup2(2),poll(2),sigaction(2),pause(2),nanosleep(2)系统调用等感兴趣。
如果第一个ffmpeg
进程超过十秒,我不明白你想要做什么。你想kill(2)吗? (然后先使用SIGTERM
进行终止,然后使用SIGQUIT
进行终止,最后使用SIGKILL
进行终止。
如果您正在编写图形程序,大多数工具包都提供了进程处理函数(因为它与事件循环混合在一起)。 GTK考虑使用g_child_watch_add和g_spawn_async。 Qt有一个QProcess
类。
答案 1 :(得分:0)
您可以在bat文件或shell脚本中编写所有命令,并调用bat文件或shell脚本。
答案 2 :(得分:0)
引自http://www.cplusplus.com/reference/clibrary/cstdlib/system/
int system(const char * command);
执行系统命令
调用命令处理器执行命令。一旦命令执行终止,处理器就会将控制权交给程序,返回一个int值,其解释依赖于系统。
我认为system
已被屏蔽。所以你不需要sleep
。
答案 3 :(得分:0)
我认为睡眠是一种很好的方式,不需要其他解决方案。