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之后退出我的主程序。@Haris
exit
只影响子进程,它是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.