- 论坛徽章:
- 0
|
在看APUE10.18这节看调用system函数的程序时,有个问题向大家讨教。以下时程序的简单描述:
sig_int(int),sig_chld(int);
main()
{
signal(SIGINT,sig_int);
signal(SIGCHLD,sig_CHLD);
system("/bin/ed");
}
书上给的system函数代码:
int system(const char *cmdstring)
{
pid_t pid;
int status;
struct sigaction ignore, saveintr, savequit;
sigset_t chldmask, savemask;
if (cmdstring == NULL)
return (1); //always a command processor with unix
ignore.sa_handler = SIG_IGN; //ignore SIGINT and SIGQUIT
sigempty(&ignore.sa_mask);
ignore.sa_flags = 0;
if (sigaction(SIGINT, &ignore, &saveintr) < 0)
return (-1);
if (sigaction(SIGQUIT,&ignore, &savequit) < 0)
return (-1);
sigemptyset(&chldmask); //now block SIGCHLD
sigaddset(&chldmask, SIGCHLD);
if (sigprocmask(SIG_BLOCK, &chldmask, &savemask) < 0)
return (-1);
if ( (pid = fork()) < 0)
{
status = -1; //probably out of processes
}
else if (pid == 0)
{
//restore previous signal actions & reset signal mask
sigaction(SIGINT, &saveintr, NULL);
sigaction(SIGQUIT, &savequit, NULL);
sigprocmask(SIG_SETMASK, &savemask, NULL);
execl("/bin/sh", "sh", "-c", cmdstring, (char*)0);
_exit(127); //exec error
}
else
{
while (waitpid(pid, &status, 0) < 0)
if (errno != EINTR)
{
status = -1; //error other than EINTR form waitpid()
break;
}
}
if (sigaction(SIGINT, &saveintr, NULL) < 0)
return (-1);
if (sigaction(SIGQUIT, &savequit, NULL) < 0)
return (-1);
if (sigprocmask(SIG_SETMASK, &savemask, NULL) < 0)
return (-1);
return (status);
}
书上说这个主程序的过程是:a.out(父进程)fork出一个shell处理命令,然后在shell上fork一个进程那就是ed。
在解释这个程序是有这么一段话:“当编辑程序终止时,对父进程(a.out进程)产生SIGCHLD信号。父进程捕捉它,执行其处理程序 sig_chld,然后从其返回。但是若父进程正捕捉SIGCHLD信号,那么在system函数执行时,父进程中该信号的递送应当阻塞。实际上,这就是 POSIX所说明的。否则,当system创建的子进程结束时,system的调用者可能错误地认为,它自己的一个子进程结束了。”
我的疑问是:1 父进程正捕捉SIGCHLD信号是什么意思????
system创建的子进程结束时,system的调用者可能错误地认为,它自己的一个子进程结束了,这又是什么意思???
但是若父进程正捕捉SIGCHLD信号,那么在system函数执行时,父进程中该信号的递送应当阻塞,这又是为什么呢???
请高手帮忙呀!!!!!!!!!!!!!!!!!!
|
|