2014-12-19 77 views
1

我使用tcsetpgrp()函數,我在gcc編譯器中運行此代碼。我想將STDOUT_FILENO更改爲由子進程創建的新組。爲什麼子進程終止?請解釋我?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int 
main (void) 
{ 
    printf("Parent pgid=%d\n", getpgrp()); 
    printf("STDOUT(parent)=%d\n", tcgetpgrp(STDOUT_FILENO)); 
    pid_t pid; 
    if(0 == (pid = fork())) 
    { 
     setpgid(0, 0);  
     printf("child pgid=%d\n", getpgrp()); 
     if(0 != tcsetpgrp(STDOUT_FILENO, 0)) 
     perror("Error"); 
     printf("After changing %d\n", tcgetpgrp(STDOUT_FILENO)); 
     exit(0); 
    } 
    wait(0); 
    return 0; 
} 
在當tcsetpgrp()函數達到終止子進程和退出狀態並不父母報告孩子的過程

+0

btw你想達到什麼:)? – 2014-12-19 09:39:26

+1

我認爲你忽略了這個「如果setpgid()用於將進程 從一個進程組移動到另一個進程組(如創建管道時由某些shell執行的操作),則兩個進程組必須是同一會話的一部分(請參閱setsid(2)和憑據(7))。「 – 2014-12-19 09:41:37

+0

是的,你可能必須調用'setsid' – Zaffy 2014-12-19 09:43:17

回答

2

當子進程調用tcsetpgrp時,它收到SIGTTOU信號,導致信號停止。當子進程停止時,父進程阻止對wait的調用,等待子進程終止。

簡單的解決辦法是忽略孩子SIGTTOU信號,只需調用fork後:

signal(SIGTTOU, SIG_IGN) 

沒有您的代碼中的另一個問題 - 你試圖改變終端的進程組爲0,這沒有任何意義。你可能想說:

tcsetpgrp(STDOUT_FILENO, getpgrp())