SIGCHLD
处理和sleep
函数之间是什么关系?
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
sig_atomic_t child_exit_status;
void clean_up_child_process(int signal_number)
{
int status;
wait(&status);
child_exit_status = status;
}
int main()
{
struct sigaction sigchld_action;
memset(&sigchld_action, 0, sizeof(sigchld_action));
sigchld_action.sa_handler = &clean_up_child_process;
sigaction(SIGCHLD, &sigchld_action, NULL);
pid_t child_pid = fork();
if (child_pid > 0) {
printf("Parent process, normal execution\n");
sleep(60);
printf("After sleep\n");
} else {
printf("Child\n");
}
return 0;
}
因为当我从上面执行代码时,它会打印:
Parent process, normal execution
Child
After sleep
但是执行过程中sleep
函数没有任何作用。这里有什么特殊之处吗?
答案 0 :(得分:1)
返回值
如果请求的时间已过,则为零,或者还剩秒数 如果呼叫被信号处理程序中断,则进入睡眠状态。
发生的事情是睡眠功能被信号处理程序中断。因此,检查了它的返回值60
。如果这是故意的话,可以使用另一种方法使剩下的几秒钟进入睡眠状态。