Я создаю связанный список динамически и инициализирую первый узел в 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;
в вилке() 'D процесса:
// 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(). Любая идея почему?
Спасибо, Христо
Не могли бы вы разместить свой код, пожалуйста? –