2010-04-07 32 views
1

我動態地創建一個鏈表,並初始化main()中的第一個節點,並且每次生成一個工作進程時我都會添加到列表中。在工作進程退出之前,我打印列表。此外,我在我的sigchld信號處理程序中打印列表。鏈表元素不見了?

在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; 
在一個叉

()'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

你可以發佈你的代碼嗎? – 2010-04-07 21:57:04

回答

1

大概你打電話fork()產生工作進程,並添加到子進程中的鏈接列表。

在調用fork()之後,現在有兩個獨立的鏈接副本 - 一個屬於父級,一個屬於子級。如果孩子添加了一個節點,它將它添加到自己的鏈接列表中 - 父母不會看到該修改。

您需要有進程將節點添加到其鏈接列表。

+0

謝謝。這就說得通了。這就是我所做的,並且我追加到子進程中的列表中,因爲在那裏我知道列表中節點的信息。 我在孩子中添加的原因是因爲我知道它的PID。我不知道外面......? – Hristo 2010-04-07 22:05:29

+0

想通了:)謝謝一堆! – Hristo 2010-04-07 22:14:52

2

信號處理程序將調用父進程 - 其樹將是一樣的,當你叉

編輯:++信息

叉創建孩子與父母的副本。父母沒有看到孩子做出的任何改變。這是不是共享內存

一旦孩子完成,SIGCHLD將在父進程中被調用。父母現在顯示它的樹。樹沒有改變,所以你得到相同的顯示

+0

+1簡介,但內容豐富。奧卡姆剃刀:-)。但我相信你可以補充一些解釋。 – pajton 2010-04-07 22:01:02

0

子進程獲取父母的內存映像的副本。它不共享。要完成此操作,您需要使用共享內存。