之前,這是我的計劃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?
歡迎來到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信號是設置爲忽略還是設置爲新過程映像中的默認操作._您對什麼感到困惑? –
但是「UNIX環境下的高級編程」說如果SIGXXX信號被設置爲被調用過程映像忽略,在新過程中信號也被忽略? – user2404124
'execv()'頁面(在我以前的評論中引用)符合APUE的說法:調用過程映像中設置爲默認操作(SIG_DFL)的_Signals應設置爲新過程映像中的默認操作。除了SIGCHLD之外,被調用的過程映像設置爲忽略的信號(SIG_IGN)應被設置爲被新的過程映像忽略。然後是原來引用的位I。不同之處在於APUE正在處理UNIX; UNIX實際上並不是POSIX(儘管兩者非常接近)。看起來你的平臺(它是什麼?)是POSIX說的原因。 –