2011-04-27 74 views
1

在此程序中,我使用execv启动另一个进程。如何获得以fork和execv开头的程序的pid

if (fork() == 0) { 
    struct rlimit limits; 
    limits.rlim_cur = 10000000; // set data segment limit to 10MB 
    limits.rlim_max = 10000000; // make sure the child can't increase it again 
    setrlimit(RLIMIT_DATA, &limits); 
    execv(...); 
} 

我该如何获得启动的程序的pid?

回答

3

它是由父fork()调用返回,所以你需要一个变量来捕捉fork()的返回值。

pid_t child_pid = fork(); 
if (child_pid == -1) { 
    // fork failed; check errno 
} 
else if (child_pid == 0) { // in child 
    // ... 
    execv(...); 
} 
else { // in parent 
    // ... 
    int child_status; 
    waitpid(child_pid, &child_status, 0); // or whatever 
} 

在孩子中,使用execv()是无关紧要的;这不会改变pid。

2

这是从fork()的原过程的返回值...

1
pid_t child; 
child = fork(); 
if (child == 0) { 
1

嘿,我认识到这段代码片段。

My answer to your previous question是如何结合fork()exec()使用setrlimit()一个示例。它并不打算作为完整的的例子,通常你会保存返回值fork()供以后使用(因为它是孩子的​​pid,这正是你想要的)。

示例代码不一定是完整的代码。

1

你想要什么是启动该程序的过程中pid

fork函数的签名如下:

#include <unistd.h> 

pid_t fork(void); 

,并返回:

  • 在孩子
  • the pid of the child
  • -10如果有错误内容时发生

如果你想创建(孩子)的新进程的pid,则必须检查返回值比0 greather。

在您的例子:

pid_t pid = fork() 

if (pid == 0) { 
    struct rlimit limits; 
    limits.rlim_cur = 10000000; // set data segment limit to 10MB 
    limits.rlim_max = 10000000; // make sure the child can't increase it again 
    setrlimit(RLIMIT_DATA, &limits); 
    execv(...); 
} 
else if (pid > 0) { 
    /* That's the value of the pid you are looking for */ 
} 

这会引起混乱,但问题是,当执行fork(),它会创建一个子进程,因此该方案在那种两个狭缝中。这就是为什么你必须检查pid价值,做你想要的东西,取决于你是否在孩子或父母身上。