Je crée dynamiquement une liste chaînée et initialise le premier nœud dans main(), et j'ajoute à la liste chaque fois que je lance un processus de travail. Avant que le processus de travail se termine, j'imprime la liste. En outre, j'imprime la liste dans mon gestionnaire de signal sigchld.éléments de liste liés disparu?
en main():
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;
dans une fourche() 'processus de 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;
fonctions:
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;
}
enfin ... le gestionnaire de signal:
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;
}
Est-il vrai que lorsque le processus de travail est en cours de fermeture, le gestionnaire de signal SIGCHLD est déclenché? Si c'est le cas, cela voudrait dire qu'après avoir imprimé l'arbre avant de quitter, la prochaine chose que je fais est dans le gestionnaire de signal qui est l'arbre d'impression ... ce qui signifierait que j'imprimerais l'arbre deux fois?
Mais l'arbre n'est pas le même. Le noeud que j'ajoute dans le processus de travail n'existe pas lorsque j'imprime dans le gestionnaire de signal ou à la fin de main(). Une idée pourquoi?
Merci, Hristo
Pourriez-vous nous écrire votre code, s'il vous plaît? –