У меня есть следующий пример кода:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main (){
printf("hello world (pid:%d)\n", (int)getpid());
int rc = fork();
if(rc < 0){ //fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { //child new process
printf("hello, i am child (pid:%d)\n", (int)getpid());
char *myargs[3];
myargs[0] = strdup("wc"); //program: "wc" (word count)
myargs[1] = strdup("p3.c"); //argument: file to count
myargs[2] = NULL; //marks end of array
execvp(myargs[0],myargs); //runs word count
printf("this shouldn't print out");
} else {//parent process
// int wc = wait(NULL);
// printf("hello, i am parent of %d (wc: %d) (pid: %d)\n", rc, wc, (int) getpid());
}
return 0;
}
Поэтому я закомментировал оператор else (аргументы или действия родительского процесса. Мне было интересно, что произойдет, или выходные данные останутся прежними, если родительскому процессу не нужно ждать дочернего процесса? Если да, Почему?
Я подумал, что, поскольку дочерний процесс является независимым процессом от родителя, результат останется прежним, но единственная ли это причина?
Некоторые указатели были бы хороши, спасибо!
return 0
и завершится, оставив дочерний процесс сиротой. - person Some programmer dude   schedule 31.10.2017wc
программы. Да, и поскольку процессы независимы, дочерний процесс будет продолжать работать, даже если родительский процесс завершится. - person Some programmer dude   schedule 31.10.2017#include
для необходимых файлов заголовков. Вы ожидаете, что мы догадаемся, какие файлы заголовков включает ваш фактический код? - person user3629249   schedule 31.10.2017fork()
— этоpid_t
, который не обязательно являетсяint
- person user3629249   schedule 31.10.2017wait()
илиwaitpid()
, иначе родительский процесс немедленно завершится, оставив дочерний процесс зомби. Единственный способ избавиться от зомби-процессов — перезагрузить компьютер. - person user3629249   schedule 31.10.2017execvp(myargs[0],myargs);
следующая строка должна быть:perror( "execvp failed" ); then
exit(EXIT_FAILURE);` - person user3629249   schedule 31.10.2017strdup()
всегда проверяйте (!=NULL) возвращаемое значение, чтобы убедиться, что операция прошла успешно - person user3629249   schedule 31.10.2017content
илиusage
(или, лучше, оба ) такие имена, какwc
иrc
, не имеют смысла даже в текущем контексте 3) отдельные блоки кода (for, if, else, while, do...while, switch, case, default) через одну пустую строку - person user3629249   schedule 31.10.2017fork()
возвращаетpid_t
, а неint
. Вы будете удивлены, еслиpid_t
не впишется вint
— а нет никакой гарантии, что он войдёт, именно поэтому он был создан в первую очередь. - person Andrew Henle   schedule 31.10.2017init()
) Когда родительский процесс завершается, цепочка прерывается. (Все еще работающий) дочерний процесс теперь является зомби. - person user3629249   schedule 31.10.2017