2011-04-27 7 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를 어떻게받을 수 있습니까? 당신이 변수에 fork()의 반환 값을 캡처해야 그것은 부모의 fork() 호출에 의해 반환 된 것

답변

3

원래의 과정에서 포크의 반환 값을()의

2

....

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를 변경하지 않습니다.

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

안녕하세요, 저는 코드 스 니펫을 인식합니다.

My answer to your previous question

fork()exec()와 조합 setrlimit()를 사용하는 방법의 일 예 이었다. 예를 들어 의도 한 것이 아니며 일반적으로 나중에 사용할 목적으로 fork()의 반환 값을 저장합니다 (여기에 원하는 자식 ID가 있으므로).

예제 코드가 반드시 완전한 코드 일 필요는 없습니다.

1

원하는 것은이 프로그램을 시작하는 프로세스의 pid입니다.

#include <unistd.h> 

pid_t fork(void); 

그것은 반환 :

fork 함수의 서명은 다음과 같다 부모

  • -1의 아이
  • the pid of the child

    • 0 오류가
    • 을 발생했습니다 경우

    만든 새 프로세스 (자식)의 pid을 얻으려면 반환 값이 0보다 큰지 확인해야합니다. 당신의 예에서

    :

    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 값을 확인하고 자녀 또는 부모에 따라 원하는 것을하십시오.