Я пытаюсь понять, как правильно использовать fork() и execvp() для выполнения команды. До сих пор у меня есть следующий код:Как правильно fork() процесс
Когда я запустил ./test vim myFile.c
, он правильно открыл myFile.c
, но я получаю странное поведение. Кажется, что есть два процесса, потому что всякий раз, когда я вводил что-либо, похоже, это происходит дважды. Почему это?
int main (int argc, char* argv[]) {
int fdin, pid, w, status;
fdin = 0;
if ((pid = fork()) < 0)
errorExit (EXIT_FAILURE);
execvp(argv[0],argv);
do {
w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(status)) {
printf("exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("killed by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("stopped by signal %d\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("continued\n");
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status))
}
'execvp (argv [0], argv)' должен просто продолжать выполнение одной и той же программы ('test', а не' vim'!) Снова и снова, поскольку вы вызываете ее как для родителя, так и для дочернего элемента 'fork() '... – vanza
после fork() код должен различать родительский и дочерний. Ваш код не делает различий, поэтому и родительский, и дочерний будут работать с кодом. Таким образом, родительский и дочерний функции выполняет функцию execvp(). чтобы дифференцировать, проверьте возвращаемое значение pid, если == 0, а затем в child, иначе в родительском. родительский (pid not - 0) пропустить вызов execvp – user3629249