2014-06-10 17 views
0

之前,這是我的計劃popen_test.cpp一個exec後,信號SIGCHLD不SIG_IGN,即使它是SIG_IGN

int main(int argc, char* argv[]) 
{ 
    signal(SIGCHLD, SIG_IGN); 
    sigset_t sset; 
    sigaddset(&sset, SIGCHLD); 
    sigprocmask(SIG_UNBLOCK, &sset, &sset); 
    char command[128] = {0}; 
    snprintf(command, sizeof(command), "python popen_test.py"); 
    FILE* file; 
    file = popen(command, "r"); 
    if (!file) 
    {  
     printf("command: %s is error\n", command); 
     return -1; 
    } 
    char result[256]={0}; 
    int len = fread(result, sizeof(char), 256, file); 
    printf("result is :%s\n", result); 
    int ret = pclose(file); 
    if (ret == -1) 
    { 
     printf("pclose error:%d, errno:%d, str_err:%s\n", ret, errno, strerror(errno)); 
     return -1; 
    } 

} 

Script是

import os 
import signal 
import subprocess 

if __name__ == "__main__": 
    test = signal.getsignal(signal.SIGCHLD) 
    if test == signal.SIG_DFL: 
     print "sig_dfl" 
    if test == signal.SIG_IGN: 
     print "sig_ign" 
    print test 

POPEN叉一個子進程;子進程調用exec運行python popen_test.py,我知道當調用exec時,SIGCHLD信號(當設置爲SIG_IGN時)可能會或可能不會被重置爲SIG_DFL。爲什麼結果是sig_dfl,而不是sig_ign?

+0

歡迎來到Stack Overflow。你不尊重['sigprocmask()']參數的'restrict'限定符(http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html)。您的編譯器應該抱怨兩次使用相同的參數。您注意到['execv()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/execv.html) 文檔,如果SIGCHLD信號被設置爲被調用過程映像忽略,未指定SIGCHLD信號是設置爲忽略還是設置爲新過程映像中的默認操作._您對什麼感到困惑? –

+0

但是「UNIX環境下的高級編程」說如果SIGXXX信號被設置爲被調用過程映像忽略,在新過程中信號也被忽略? – user2404124

+0

'execv()'頁面(在我以前的評論中引用)符合APUE的說法:調用過程映像中設置爲默認操作(SIG_DFL)的_Signals應設置爲新過程映像中的默認操作。除了SIGCHLD之外,被調用的過程映像設置爲忽略的信號(SIG_IGN)應被設置爲被新的過程映像忽略。然後是原來引用的位I。不同之處在於APUE正在處理UNIX; UNIX實際上並不是POSIX(儘管兩者非常接近)。看起來你的平臺(它是什麼?)是POSIX說的原因。 –

回答

0

您不尊重sigprocmask()參數上的限定符限定符。您的編譯器應該抱怨兩次使用相同的參數。


的POSIX規範execv()文件:

信號設置爲調用進程映像中的默認動作(SIG_DFL)應設置爲新的過程映像中的默認操作。除了SIGCHLD之外,調用過程映像設置爲忽略的信號(SIG_IGN)應設置爲由新過程映像忽略。

如果SIGCHLD信號設置爲被調用過程映像忽略,則不指定SIGCHLD信號是設置爲忽略還是設置爲新過程映像中的默認操作。

OP評論:

但「UNIX環境高級編程」說,如果SIGXXX信號被設置爲調用進程映像被忽略,在新的過程中,信號也就是被忽略?

區別在於APUE與UNIX有關; UNIX實際上並不是POSIX(儘管兩者很接近)。 POSIX表示,一個平臺可以符合POSIX標準,並且仍然可以在原始過程中將SIGCHLD重置爲SIG_DFL,即使它是SIG_IGN。你的代碼似乎證明你的平臺是爲什麼POSIX給予SIGCHLD的豁免。

出於好奇,您正在使用哪個平臺?

+0

linux gun libc 2.4 python 2.4 – user2404124