Я внедряю оболочку Job Control в C в Linux как проект по теме, связанной с операционными системами.У меня есть функция 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();
}
Дело в том, что при вызове обработчика некоторые записи не следует удалять, посколькупроцесс, который они представляют, не завершается, а удаляется, когда не должен.Кто-нибудь знает, почему это происходит?
Спасибо и извините за потерянное время :(