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