Я студент, изучающий C и как создавать процессы с использованием fork (). Не могли бы вы объяснить, в чем разница между этими двумя кодами, потому что я пробовал оба, и они не работали, как ожидалось.
child = fork();
child1 = fork();
if (child == 0 && child1 == 0){//Parent}
else if (child > 0 && child1 == 0){//first child}
else if (child == 0 && child1 > 0){//second child}
else {third child}
это правильный способ создания детей или тот, что ниже?
child = fork();
if (child == 0)
{
child1 = fork();
if (child1 == 0)
{// grandchild
}
else
{//child
}
}
else
{//parent
}
Это примеры, написанные мной о том, что меня смутило. Вот код, у меня проблемы с
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, char ** argv)
{
pid_t child;
pid_t child1;
// at least, there should be 3 arguments
// 2 for the first command, and the rest for the second command
//printf("%d\n", argc);
if (argc < 4) {
fprintf(stderr, "Usage: %s cmd1 cmd1_arg cmd2 [cmd2_args ..]\n", argv[0]);
return 1;
}
child = fork();
//pid_t child1;
// TODO
if (child < 0)
{
perror("fork()");
exit(EXIT_FAILURE);
}
if (child == 0)//child1
{
//printf("exited=%d exitstatus=%d\n", WIFEXITED(exitStatus), WEXITSTATUS(exitStatus));
child1 = fork();
if (child1 == 0)//grandchild
{
execlp(argv[1],argv[1],argv[2],NULL);
perror("execlp()");
exit(EXIT_FAILURE);
}
else //first child
{
int status1;
waitpid(child1, &status1, 0);
printf("exited=%d exitstatus=%d\n", WIFEXITED(status1), WEXITSTATUS(status1));
execvp(argv[3], (argv + 3));
perror("execlp()");
exit(EXIT_FAILURE);
}
}
else//parent
{
int status;
waitpid(child, &status, 0);
printf("exited=%d exitstatus=%d\n", WIFEXITED(status), WEXITSTATUS(status));
}
return 0;
}
Я могу заставить код работать так, как задумано, но я не совсем понимаю, как использовать WIFEXITED и WEXITSTATUS. Мой код выводится, когда я запускаю этот код
execlp(): No such file or directory
Makefile
exited=1 exitstatus=0
И правильный вывод:
execlp(): No such file or directory
Makefile
exited=1 exitstatus=1
exited=1 exitstatus=0
Аргументы, используемые в этом тестовом примере
cal -3 ls Makefile
Почему Я пропустил второй выход печати?