2017-04-16 46 views
0

在C中,运行外部程序并获得此程序的PID的最佳方法是什么? 我在这里看到了一些有关使用fork()的答案......但据我了解,fork()副本的当前进程并创建一个子进程。如果可能的话,我想创建一个完全分离的上下文......而获得PID的原因是为了在未来完全取消这个过程。当我的服务器可以发送命令来启动客户端上的某些程序时,我正在构建一个客户端/服务器程序。这些程序是外部的,并且多于一个同名的c /可执行文件可以同时运行(这就是为什么我不能'尝试'通过程序名找到pid的原因)。另外,这些程序应该以'后台'运行......我的意思是,我无法锁定我的调用函数。 我不确定fork()会在这种情况下帮助我。C - 在后台启动外部程序并获得pid

+0

研究这个线程:http://stackoverflow.com/questions/5883462/linux-createprocess#5884588 – cmks

+0

您可以使用守护进程(3)和其他deamons一样安全pid到某些文件 – fghj

+1

使用'fork()'加上一个'exec *()'函数是正常的方法。如果您需要重新组织I/O或关闭管道描述符或其他任何内容,它比'posix_spawn()'更直接。你可以用'posix_spawn()'来操纵那些,但这很难。 –

回答

0

我喜欢做的是使用posix_spawn。这是很容易比fork使用和IMO感觉很多更直观:

#include <spawn.h> 
#include <string.h> 
#include <stdio.h> 

extern char **environ; 

int main() { 
    pid_t pid; 
    char *argv[] = {"gcc", "file.c" (char*)0}; 

    int status = posix_spawn(&pid, "/usr/bin/gcc", NULL, NULL, argv, environ); 
    if(status != 0) { 
     fprintf(stderr, strerror(status)); 
     return 1; 
    } 
    return 0; 
} 
+0

这看起来正是我所需要的!我会在这里测试并报告:) Tks! –

+0

只有一个小问题....我不能杀死这个进程:(我在做什么错误?我已经改变了命令直接打开可执行文件(没有'sh'),一切工作正常,PID返回我可以用htop确认pid是正确的,但是我发送的每一个信号(使用C或者命令行)都没有做任何事情,程序仍在运行。 –

相关问题