Я динамически создаю связанный список и инициализирую первый узел в main (), и добавляю в список каждый раз, когда запускаю рабочий процесс. Перед выходом из рабочего процесса я распечатываю список. Кроме того, я печатаю список внутри моего обработчика сигнала sigchld.
в основном ():
head = NULL;
tail = NULL;
// linked list to keep track of worker process
dll_node_t *node;
node = (dll_node_t *) malloc(sizeof(dll_node_t)); // initialize list, allocate memory
append_node(node);
node->pid = mainPID; // the first node is the MAIN process
node->type = MAIN;
в форке () обрабатывал:
// add to list
dll_node_t *node;
node = (dll_node_t *) malloc(sizeof(dll_node_t));
append_node(node);
node->pid = mmapFileWorkerStats->childPID;
node->workerFileName = mmapFileWorkerStats->workerFileName;
node->type = WORK;
функции:
void append_node(dll_node_t *nodeToAppend) {
/*
* append param node to end of list
*/
// if the list is empty
if (head == NULL) {
// create the first/head node
head = nodeToAppend;
nodeToAppend->prev = NULL;
} else {
tail->next = nodeToAppend;
nodeToAppend->prev = tail;
}
// fix the tail to point to the new node
tail = nodeToAppend;
nodeToAppend->next = NULL;
}
наконец ... обработчик сигнала:
void chld_signalHandler() {
dll_node_t *temp1 = head;
while (temp1 != NULL) {
printf("2. node's pid: %d\n", temp1->pid);
temp1 = temp1->next;
}
int termChildPID = waitpid(-1, NULL, WNOHANG);
dll_node_t *temp = head;
while (temp != NULL) {
if (temp->pid == termChildPID) {
printf("found process: %d\n", temp->pid);
}
temp = temp->next;
}
return;
}
Правда ли, что при выходе из рабочего процесса запускается обработчик сигнала SIGCHLD? Если это так, это будет означать, что после того, как я распечатаю дерево перед выходом, следующее, что я делаю, - это обработчик сигнала, который печатает дерево ... что означало бы, что я напечатал бы дерево дважды?
Но дерево не то же самое. Узел, который я добавляю в рабочий процесс, не существует, когда я печатаю в обработчике сигнала или в самом конце main (). Есть идеи почему?
Спасибо,
Христо