Правильный способ использования execlp и execvp при сообщении о состоянии выхода в C - PullRequest
0 голосов
/ 16 марта 2020

Я студент, изучающий 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

Почему Я пропустил второй выход печати?

1 Ответ

0 голосов
/ 16 марта 2020

Ваши первые два фрагмента кода совсем не совпадают .

Первый случай,

enter image description here

Второй случай,

enter image description here

...