6

次のプログラムの出力を理解できません。子プロセスが戻った後、wait() の前に親プロセスが 3 秒間スリープしていないことがわかりました。SIGCHLD がデフォルト ハンドラーに設定されている場合、3 秒間スリープし、wait を呼び出して期待どおりに戻ります。ここで正確に何が起こっているのですか??

# include <unistd.h>
# include <sys/types.h>
# include <stdio.h>
# include <sys/wait.h>
# include <signal.h>

void handler(int sig) {
printf("Iam in handler ...\n");
}

main() {

int status;
pid_t pid;

struct sigaction act;
//act.sa_flags=SA_NOCLDSTOP;
act.sa_handler=handler;
sigaction(SIGCHLD,&act,NULL);

if(!fork()) {
printf("child process id is  %d\n",getpid());
 return 1;
}  

printf("xxx ...\n");
sleep(3);
pid = wait(&status);
printf("process terminated is %d\n",pid);

}

output::

xxx ...
child process id is  2445
Iam in handler ...
process terminated is 2445
4

2 に答える 2

13

sleep()の男から:

sleep() は、seconds秒が経過するか、無視されないシグナルが到着するまで、呼び出しスレッドをスリープ状態にします。

あなたの子供が終了すると、信号があなたを目覚めさせます。

からの戻り値sleep():

要求された時間が経過した場合はゼロ、または呼び出しがシグナルハンドラーによって中断された場合は、スリープするまでの秒数。

眠りを「終わらせる」手助けをしたい場合に使用できます。

unsigned sleep_time = 3;
...
while((sleep_time = sleep(sleep_time)) > 0) {}
pid = wait(&status);
...
于 2013-01-10T20:23:15.790 に答える
9

子プロセスが終了すると、 aSIGCHLDが親プロセスに送信されます。あなたの場合、それは中断しsleep、プロセスがスリープしていないように見えます。

問題の要点:sleepシグナルによって中断された場合、再起動されません。

于 2013-01-10T20:15:49.980 に答える