элементы связанного списка пропали? - PullRequest
1 голос
/ 08 апреля 2010

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

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

Ответы [ 3 ]

2 голосов
/ 08 апреля 2010

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

изменить: ++ информация

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

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

1 голос
/ 08 апреля 2010

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

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

Вам необходимо, чтобы процесс parent добавил узел вего связанный список.

0 голосов
/ 08 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...