2012-03-14 56 views
2

我寫我自己的unix shell作爲我的任務的一部分,我無法處理創建後臺進程。我寫了一個信號處理功能,並實施了必要的(從我的觀點,但顯然還不夠好點)部件,以我的代碼如下:在我自己的shell中創建後臺進程

void handler(int sig) 
{ 
    int pid; 
    int status; 
    pid = wait(NULL); 
    printf("[%d]retval: %d \n", pid, WEXITSTATUS(status)); 
    fflush(stdout); 
} 

int main() { 
..... 
.... 
struct sigaction sigchild; 
memset (&sigchild, 0, sizeof(sigchild)); 
sigchild.sa_handler = handler; 
sigchild.sa_flags = SA_SIGINFO | SA_NOCLDWAIT; 
... 
... 
if(isBackground) //background process 
{ 
    sigaction(SIGCHLD, &sigchild, 0); 
} 

當我進入「休眠5 &」例如,然後輸入「ps」查看沒有睡眠的過程。可能是什麼問題?提前致謝。

+0

與您的問題沒有關係,但絕對不能在信號處理程序中使用'printf()'。你可能會發現信號處理程序中的wait()也是一個災難。 – JeremyP 2012-03-14 17:52:26

+0

也許「man 3守護進程」可以提供幫助? Afaik是最簡單的任何事情守護進程的最簡單的方法。 – AoeAoe 2012-03-14 19:12:23

回答

0

孩子是後臺進程。父級是前臺進程。 SIGCHLD是孩子終止時發送給父母的信號。將if (isbackground更改爲if(!background)

+0

其實我正在檢查它是否(isBackground &&!child)。 – goncag 2012-03-14 16:45:17

+0

您希望爲創建子進程的父進程提供'sigaction'。這將防止殭屍進程。 – 2012-03-14 16:49:42

相關問題