所以基本上我希望“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);
}
答案 0 :(得分:2)
kill返回0,如果没有发送信号,则返回-1。如果进程已经退出,则无法发送任何信号,因此kill的返回值可用于告诉您进程是否被kill杀死或已经死亡。
此外,您可以使用其中一个等待系统调用来查看子进程的状态更改(包括退出)。
您还应该查看父进程中SIGCHLD的信号处理,当孩子改变状态(包括退出)时,父进程将接收信号处理,并且还会使父进入睡眠状态(尽管在某些系统上睡眠功能)可能会重新开始睡觉。)
如果孩子在你的时间限制内退出,你可以使用等待和/或SIGCHLD让父母更快完成。
您应该注意,您可能应该等待子进程退出,这样您就不会创建僵尸(已调用exit但必须保留的进程,以防父进程查看其退出状态)。
你想要研究的另一件事是errno值EINTR,如果系统调用被信号中断,它们可以设置它。
从命令行输入:
man errno
man 2 wait
man 2 sigaction
有关我所谈及的事情的更多信息。
答案 1 :(得分:1)
你的意思是这样吗?
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);
}