2010-04-07 5 views
1

Я создаю связанный список динамически и инициализирую первый узел в 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(). Любая идея почему?

Спасибо, Христо

+0

Не могли бы вы разместить свой код, пожалуйста? –

ответ

1

Предполагается, что вы вызываете fork() для создания рабочего процесса и добавления связанного списка в дочерний процесс.

После того, как вы позвонили fork(), теперь есть две независимые копии вашего связанного списка: один принадлежит родительскому объекту и один принадлежит дочернему. Если дочерний элемент добавляет узел, он добавляет его в свой собственный связанный список - модификация не будет отображаться родителем.

У вас должен быть родитель процесс добавляет узел в свой список.

+0

спасибо. в этом есть смысл. это то, что я делаю, и добавляю к списку в дочернем процессе, потому что там я знаю информацию для узла в списке. причина, по которой я добавляю ребенка, потому что я знаю его ПИД. Я не знаю этого снаружи ...? – Hristo

+0

понял это :) Спасибо! – Hristo

2

обработчик сигнала будет вызван в родительском процессе - его дерево будет таким же, как и при раздвоенный

редактировать: ++ Информация

Вилка создает ребенок с копией родителя. Любое изменение, которое делает ребенок, не рассматривается родителем. Это не общая память

SIGCHLD вызывается в родительском процессе после того, как ребенок закончит. Теперь родительский элемент отображает свое дерево. Дерево не изменилось, поэтому вы получаете тот же самый дисплей.

+0

+1 Краткая, но информативная. Ockham Razor :-). Но я думаю, вы могли бы добавить еще несколько объяснений. – pajton

0

Детский процесс получает копию изображения памяти родителя. Он не используется. Для этого вам необходимо использовать общую память.