2016-08-13 161 views
1

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

system() or execv() 

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

回答

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过程(=要求其终止):

kill(pid, SIGTERM); //please terminate 

,您可以使用waitpid检索其退出状态已经终止之后。


system内部使用fork + execv(IT高管壳)+ waitpid。因为waitpid部分不system分开,system让你等待子进程结束。)

你可能也想看看dup2pipesocketpair建立一个基于fildescriptor,通信信道与子进程(也有其他选项,如共享内存,消息队列,或信号如果你只需要非常基本的沟通)。

manpages是管理进程和IPC的很好的资源。

+0

thx这有助于很多:)我想我将在未来使用它,但现在我重新设计我的测试更简单:1.在单独的pthread上运行测试服务器2.执行shell cmd以使用popen()3回显此服务器。获取cmd输出并声明它是正确的。 –

0

如何执行/开/由C运行另一个程序?

使用system

如何不就可以阻止?

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

我想有跨平台或最小的MacOS/Windows/Linux(Ubuntu)工作解决方案。

system作品在Linux和Windows,但我没有对其他平台

+0

确定thx,但我可以以后关闭它吗? –

+0

@MichałZiobro,不客气,有问题吗? – Mouin

相关问题