C++ 如何从C执行命令并终止它
我有如下命令:C++ 如何从C执行命令并终止它,c++,c,linux,C++,C,Linux,我有如下命令: ./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www " 用于通过以太网传输视频。目前我正在运行终端,要退出,我只需按Ctrl+c。但我需要用c代码来完成。是否有可能或有其他方法可用 谢谢。我们通常使用系统(“命令”) 将整个命令复制到字符串中比如str ./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 128
./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www "
用于通过以太网传输视频。目前我正在运行终端,要退出,我只需按Ctrl+c。但我需要用c代码来完成。是否有可能或有其他方法可用
谢谢。我们通常使用系统(“命令”)强> 将整个命令复制到字符串中比如str
./mjpg_streamer -i "./input_uvc.so -n -f 15 -r 1280x720" -o "./output_http.so -n -w ./www "
输入字符串,然后使用
system(str); //in c code.
您可以使用
system()
调用pkill。从技术上讲,您可以使用fork()
和exec
系列执行您需要执行的操作
它可能是这样工作的:
pid_t PID = fork();
if(PID == 0) {
execl("yourcommandhere");
exit(1);
}
//do Whatever
kill(PID, 15); //Sends the SIGINT Signal to the process, telling it to stop.
execl
(或该系列的任何其他成员,请看此处:)将用您正在调用的进程替换当前进程。这是我们用fork创建的子进程。Fork将子进程的“0”和子进程的实际进程ID返回给原始进程调用Fork,从而提供原始进程控制
通过调用kill
并提供SIGINT
(15),您告诉具有指定PID(从fork获得)的进程停止exit(1)
是必需的,因为否则,如果execl
失败,您将有两个进程在您的手中做同样的事情。这是故障保险
我希望这有帮助。当您使用
系统(./mjpg\u拖缆)执行时。
创建了一个用户进程mjpg_拖缆
您可以使用pkill(mjpg_streamer)再次终止此进程。@Gangadhar问题是,系统会冻结程序,因为它会等待您刚才调用的进程完成。基本上,
system
调用:fork()
、execl()
和wait()
。@RefugniteTernium,是的,同意,您建议的方法在这种情况下可以正常工作。感谢您指出这一点。不,当mjpg_拖缆仍在运行时,system
的第一次调用不会返回。在所有这些之后,调用waitpid(PID,NULL,0)
告诉内核您已经完成了子进程句柄的操作。我可以不退出(1)而这样做吗,因为我不想在kill之后退出我的主程序。@Harisexit
只影响子进程,它是mjpg_streamer软件,而不是主进程。如您所见,只有当PID等于0时才会调用它,这会导致主进程跳过它,因为fork
返回该PID的实际PID。您可以在第一个命令的末尾添加&符号,因此,它可以异步运行-即,当您的C程序继续运行时,mjpg_拖缆将在“后台”运行。了解和中,也许还有
pid_t PID = fork();
if(PID == 0) {
execl("yourcommandhere");
exit(1);
}
//do Whatever
kill(PID, 15); //Sends the SIGINT Signal to the process, telling it to stop.