2015-05-30 2 views
1

Это для класса, поэтому я пытаюсь понять, почему переменная nChars не устанавливается при возврате дочернего процесса. Я прочитал, что waitpid() пожинает дочерний процесс, но когда я пытаюсь напечатать nChars он все еще показывает ноль, когда nChars порожденных является количество символов командной строкиРодительский процесс не извлекает переменную возвращаемого значения

int main(int argc, char **argv) 
{ 
    // set up pipe 
    int  fd[2], status; 
    pid_t childpid; 

    pipe(fd); 
    // call fork() 
    if((childpid = fork()) == -1){ 
    perror("pipe"); 
    return -1; 
    } 
    if (childpid == 0) { 
     // -- running in child process -- 
     int  nChars = 0; 
     char ch; 

     close(fd[1]); 
     // Receive characters from parent process via pipe 
     // one at a time, and count them. 

     while(read(fd[0], &ch, 1) == 1)nChars++; 

     // Return number of characters counted to parent process. 
     printf("child returns %d\n", nChars); 
     close(fd[0]); 

     return nChars; 
    } 
    else { 
     // -- running in parent process -- 
     int  nChars = 0; 
     close(fd[0]); 

     printf("CS201 - Assignment 3 - \n"); 

     // Send characters from command line arguments starting with 
     // argv[1] one at a time through pipe to child process. 

     for(int i=1; i < argc; i++) 
      write(fd[1], argv[i], strlen(argv[i])); 


     // Wait for child process to return. Reap child process. 
     // Receive number of characters counted via the value 
     // returned when the child process is reaped. 

     waitpid(childpid, &status, WNOHANG); 
     printf("child counted %d characters\n", nChars); 
     close(fd[1]); 
    return 0; 
    } 
+0

согласно [этой странице] (http://linux.die.net/man/2/waitpid), 'WNOHANG' означает, что он не подождите, пока дочерний процесс не вернется. Вы должны проверить возвращаемое значение 'waitpid', чтобы проверить, было ли ожидание успешным. Примечание: см. Также 'WIFEXITED' и' WEXITSTATUS' на той же странице. – wimh

ответ

2

Родитель и ребенок не разделяют память, поэтому они имеют разные переменные nChars. Ребенок - КОПИЯ родителя, поэтому, когда вы меняете некоторые переменные в копии, они не меняются в оригинале. Если вам нужна одна переменная, видимая из двух потоков выполнения, используйте потоки.

Вы возвращаете nChars из child как код выхода процесса, поэтому он будет в переменной статуса. Try:

waitpid(childpid, &status, 0); 
// removed WNOHANG because with it parent won't wait for child to exit 
printf("child counted %d characters\n", status); 

Но было бы лучше использовать прийти IPC механизм, как трубы или сокеты для передачи данных между ребенком и родителем, потому что выход кода для состояния выхода программы, код завершения 0 означает, что все в порядке, и другой Коды выхода означают, что что-то пошло не так, код выхода не предназначен для передачи произвольных данных

+0

Я согласен, что было бы лучше передавать данные по-разному. цель назначения - заставить родительский процесс использовать полученный код как переменную для nChars. status возвращает количество аргументов в командной строке, а не количество символов. – thepi

 Смежные вопросы

  • Нет связанных вопросов^_^