1

如何从 C 执行/打开/运行另一个程序,而不是阻止它,而是让它同时运行。然后我想做一些像服务器/客户端这样的测试,如果已经完成了,我只想杀死/关闭这个程序。我读过关于

system() or execv() 

但是第一个似乎阻止了等待结果,第二个似乎只在Linux上工作?在最好的情况下,我希望拥有跨平台或最低限度的 MacOS/Windows/Linux(Ubuntu) 工作解决方案。当我不再需要它时,我还需要关闭这个以前打开的程序。

4

2 回答 2

3

执行此操作的 POSIX 方法(也可能在 Windows中使用——https ://technet.microsoft.com/en-us/library/bb463220.aspx ?)是使用fork + exec*组合:

您使用fork创建一个复制当前进程的新进程。您对该进程的句柄是一个int进程标识符(pid):

int pid;

if (0 > (pid=fork()){
   perror("fork failed");
   return -1;
}
if (0 == pid){
   //CHILD PROCESS
   printf("I'm the child process, my pid is: %d\n", getpid());

}
//pid > 0 ==> PARENT PROCESS
puts ("I'm the parent process"); 
printf("The pid of the child I've just spawned is %d\n", pid);

要在子进程中运行可执行文件,请使用exec*函数将当前(例如,如果您在子进程中运行,则为子进程)进程映像替换为从可执行文件加载的进程映像。

在父进程中,您可以使用pid句柄来终止进程(=要求它终止):

 kill(pid, SIGTERM);  //please terminate 

并且您可以使用waitpid在它终止后检索其退出状态。


系统内部使用fork+ execv(它执行一个 shell) + waitpid。因为这waitpid部分不是分开的systemsystem所以让你等待子进程完成。)

您可能还需要查看dup2pipesocketpair来设置与子进程的基于 fildescriptor 的通信通道(如果您只需要非常基本的通信,还有其他选项,例如共享内存、消息队列或信号) .

手册页是管理进程和 IPC 的一个很好的资源。

于 2016-08-13T14:04:58.897 回答
0

如何从 C 执行/打开/运行另一个程序?:

利用system

怎么不屏蔽呢?

你必须实现多任务,所以fork用来创建另一个进程或pthread_create 创建另一个线程,看看这个

我想要跨平台或最低限度的 macOS/Windows/Linux(Ubuntu) 工作解决方案。

system适用于linux和windows,但我对其他平台没有任何想法

于 2016-08-13T13:51:32.520 回答