我正在 Linux 中以 C 语言实现作业控制外壳,作为操作系统相关主题的项目。我有一个执行子进程管理的 main() 函数,它帮助了一个链接列表,如此处所示,其中存储了背景和暂停的作业信息:
typedef struct job_
{
pid_t pgid; /* group id = process lider id */
char * command; /* program name */
enum job_state state;
struct job_ *next; /* next job in the list */
} job;
每次子进程退出或停止时,都会向父进程发送一个 SIGCHLD 以得到通知。然后,我有一个信号处理程序,如此处所示,对于该作业状态链表的每个节点,检查该节点中表示的进程是否已退出,如果退出,则将该节点从链表中删除。这是 SIGCHLD 处理程序的代码,其中 'job_list' 是存储信息的链表:
void mySIGCHLD_Handler(int signum) {
block_SIGCHLD();
if (signum == 17) {
job *current_node = job_list->next, *node_to_delete = NULL;
int process_status, process_id_deleted;
while (current_node) {
/* Wait for a child process to finish.
* - WNOHANG: return immediately if the process has not exited
*/
waitpid(current_node->pgid, &process_status, WNOHANG);
if (WIFEXITED(process_status) != 0) {
node_to_delete = current_node;
current_node = current_node->next;
process_id_deleted = node_to_delete->pgid;
if (delete_job(job_list, node_to_delete)) {
printf("Process #%d deleted from job list\n", process_id_deleted);
} else {
printf("Process #%d could not be deleted from job list\n", process_id_deleted);
}
} else {
current_node = current_node->next;
}
}
}
unblock_SIGCHLD();
}
问题是,当处理程序被调用时,一些不应该被删除的条目,因为它们所代表的进程没有退出,当它们不应该被删除时被删除。任何人都会知道为什么会这样?
谢谢你,对你失去的时间感到抱歉:(