[英]C signals and processes
因此,基本上我希望“ cmd_limit”取一个以秒为单位的数字,这是我们等待子进程完成的最长时间(可以安全地假设只有一个)。 如果子进程确实在睡眠过程中完成,我希望cmd_limit返回pass而不运行其余的cmd_limit代码。 谁能帮我做到这一点,这就是我到目前为止所拥有的。
int cmd_limit( int limit, int pid ) {
signal( SIGCHLD, child_died );
sleep( limit );
kill( pid, SIGKILL );
printf("killin'\n");
return PASS;
}
void child_died( int sig ) {
int stat_loc; /* child return information */
int status; /* child return status */
waitpid( -1, &stat_loc, WNOHANG );
if( WIFEXITED(stat_loc) ) { // program exited normally
status = WEXITSTATUS( stat_loc ); /* get child exit status */
}
printf("child died: %s\n", signal);
}
如果发送了信号,kill将返回0,如果没有发送信号,则返回-1。 如果该进程已经退出,则不会发送任何信号,因此kill的返回值可用于告诉您该进程是被kill杀死还是已经死亡。
另外,您可以使用wait系统调用之一来查看子进程的状态更改(包括exit)。
您还应该研究父进程中SIGCHLD的信号处理,当子进程更改状态(包括exit)时,父进程会收到该信号,并且还会使父进程退出睡眠状态(尽管在某些系统上,睡眠功能可能会重新开始睡眠) )。
如果孩子在您的时限内退出,则使用wait和/或SIGCHLD可以使父母更快完成工作。
您应该注意,您可能应该调用wait等待子进程退出,以免创建僵尸(已调用exit但必须保留在周围的进程,以防父进程希望查看其退出状态)。
您还要查看的另一件事是errno值EINTR,如果系统调用被信号中断,则可以设置该值。
在命令行中输入:
man errno
man 2 wait
man 2 sigaction
有关我所谈论的内容的更多信息。
你是说这个意思吗
bool childDied;
int cmd_limit( int limit, int pid ) {
childDied = FALSE;
signal( SIGCHLD, child_died );
sleep( limit );
if (!childDied)
{
kill( pid, SIGKILL );
printf("killin'\n");
}
return PASS;
}
void child_died( int sig ) {
int stat_loc; /* child return information */
int status; /* child return status */
childDied = TRUE;
waitpid( -1, &stat_loc, WNOHANG );
if( WIFEXITED(stat_loc) ) { // program exited normally
status = WEXITSTATUS( stat_loc ); /* get child exit status */
}
printf("child died: %s\n", signal);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.