我動態地創建一個鏈表,並初始化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()的最後打印時,我在工作進程中添加的節點不存在。任何想法爲什麼?
感謝, 斯托伊奇
你可以發佈你的代碼嗎? – 2010-04-07 21:57:04