2014-11-08 69 views
0

你好,我有這樣的問題c保存分叉PID

pid_t pid1; 
pid_t pid2; 

void switch_files(int sig_type) 
{ 
    printf("%d %d\n", pid1, pid2); 
} 
int main(int argc, char **argv) 
{ 
    pid_t lpid1,lpid2;   
    if ((lpid1 = fork()) == 0) 
    { 
     signal(SIGUSR1, switch_files); 
     //Some work 
    } else { 
     pid1 = lpid1; 
    } 
    if ((lpid2 = fork()) == 0) 
    { 
     signal(SIGUSR2, switch_files); 
     //Some work 

    } else { 
     pid2 = lpid2; 
    } 


    while(scanf("%s", input) > 0) 
    { 
     write(pipe1[1], input, strlen(input) + 1); 
     kill(pid1, SIGUSR1); 
    } 

    waitpid(pid1, 0, 0); 
    waitpid(pid2, 0, 0); 
} 

,所以我需要在我的回調信號pid1pid2價值,並在printf的我有0 0但主要我有PID的正常值。我如何解決這個問題,謝謝你的幫助。

+1

'//一些工作'部分是否包含子進程退出,或者您的代碼是否落入運行代碼,這意味着只能在父代中運行? – hyde 2014-11-08 20:51:53

+0

第二個孩子會知道第一個孩子的pid;第一個孩子將永遠不會知道第二個孩子的pid,除非您採取重大措施將信息轉達給第一個孩子。 – 2014-11-08 20:58:34

回答

0

如果你想孩子有信息,你必須以某種方式與他們溝通這些信息。您可以使用文件,管道,共享內存或任何您想要的機制。但是你必須以某種方式傳遞信息。

2

如果你希望孩子有PID,簡單地問它:

if ((lpid1 = fork()) == 0) 
    { 
     pid1 = getpid(); 
     pid2 = -1; // other child doesn't even exist yet 
     signal(SIGUSR1, switch_files); 
     //Some work 
     exit(0); // you don't want the child to go executing parent code, do you? 
    } 

而且

if ((lpid2 = fork()) == 0) 
    { 
     //pid1 already set with pid of 1st child 
     pid2 = getpid(); 
     signal(SIGUSR2, switch_files); 
     //Some work 
     exit(0); // you don't want the child to go executing parent code, do you? 
    } 

如果您需要在第一個孩子有第二個孩子的PID,那麼你需要使用some form of IPC,所以你也可以在第二個孩子已經開始且其PID已知的情況下與第一個孩子通信。