2012-04-15 61 views
8

Tôi đang viết chương trình Mapreduce sử dụng nhiều ống I/O (một ống cho mỗi quy trình) để nhận được một số kết quả cuối cùng. Tôi đang gặp sự cố khi tạo quy trình. Cụ thể, tôi nhận được lỗi sau:fork() - nhiều quy trình và cuộc gọi hệ thống

wait error: Interrupted system call 

Đây là mã của tôi mà spawns quá trình:

while (values[inc]!=NULL) //provided array of text lines 
{ 
    if ((pid = fork()) == -1) { 
     perror("fork error"); 
     exit(EXIT_FAILURE); 
    }  

    else if (pid == 0) {    /* start of child process  */ 
     printf("Child process...\n"); 
     /* pipes[inc][1] is a file descriptor to which myMap writes some data 
      using the write() system call 
      mr is a struct that holds other function pointers */ 
     mr->myMap(pipes[inc][1],values[inc]); 
     exit(0); 
    } 
    else {       /* start of parent process  */ 
     printf("Parent process...\n"); 

     if ((wpid = wait(&status)) == -1) 
     /* Wait for child process.  */ 
      perror("wait error"); 
     else {      /* Check status.    */ 
      if (WIFSIGNALED(status) != 0) 
       printf("Child process ended because of signal %d\n", 
         WTERMSIG(status)); 
      else if (WIFEXITED(status) != 0) 
       printf("Child process ended normally; status = %d\n", 
         WEXITSTATUS(status)); 
      else 
       printf("Child process did not end normally\n"); 
     } 
     //close(fd[1]); 

     printf("Parent process ended\n"); 
    } 
    inc++; 
} 

Sau này tôi đang tạo ra một thread

pthread_t newThread; 
pthread_create(&newThread,NULL,threadFunction,values); 
pthread_join(newThread,NULL); 

Các threadFunction sử dụng chọn () để tìm ra bộ mô tả tập tin nào đã sẵn sàng để đọc và đọc nó và đặt dữ liệu vào một từ điển.

Khi chạy debugger dạng gdb, sản lượng chương trình:

Parent process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 
Parent process... 
Child process ended normally; status = 0 
Parent process ended 
Parent process... 
Child process... 
Child process... 
wait error: Interrupted system call 
Parent process ended 

Tôi không biết làm thế nào để giải quyết vấn đề. Bất kỳ đề xuất?

Cảm ơn!

Trả lời

9

Bạn cần đặt số cuộc gọi wait() vào vòng lặp và nếu nó trả về lỗi (-1) và errno == EINTR tiếp tục vòng lặp. Bất kỳ lỗi nào khác đều là lỗi thực và phải được xử lý như vậy.

Những điều như giờ profiling có thể gây ra các tín hiệu được gửi đến quá trình này, tuy nhiên các tín hiệu có thể gây ra sự gián đoạn là SIGCHLD, mà như bạn đã biết được gọi khi một quá trình con thay đổi trạng thái.

EDIT: OK, tôi sẽ viết câu trả lời trong mã:

do 
{ 
    wpid = wait(&status); 
} 
while (wpid == -1 && errno == EINTR); 
if (wpid == -1) 
{ 
    perror("wait error"); 
    return -1; 
} 
else 
{ 
    // we have wait status 
    ... 
} 
+0

Tôi không chắc chắn những gì bạn có ý nghĩa. Xin hãy giải thích. – Krzysiek

+1

@Rafcio Tôi đã cập nhật câu trả lời của mình. – trojanfoe

+1

Cảm ơn. Nó có ý nghĩa! :) – Krzysiek

Các vấn đề liên quan