exevp пропускает весь код до вызова ожидания в c

Я пытаюсь выполнить файл, используя fork и execvp, однако сталкиваюсь с некоторыми ошибками. Я не нашел никаких решений проблемы, с которой я сталкиваюсь здесь, в Интернете, так как я не получаю никаких ошибок от своего exevp и не запускаю его. Вот мой код:

 pid_t child;
    int status;
    child = fork();
    char *arg[3] = {"test","/home/ameya/Documents/computer_science/cs170/project1", (char*) 0};
    if(child == 0){
        printf("IN CHILD BEFORE EXECVP\n");
        int value = execvp(arg[0],arg);
        if(value < 0){
            printf("ERROR\n");
        }else{
            printf("In Child : %i\n", value);
        }
    }
    if(waitpid(child, &status, 0) != child){
        printf("ERROR IN PROCESS\n");
    }
    printf("In Parent\n");

Когда я пытаюсь запустить этот код, он выводит только «IN CHILD BEFORE EXCEPTION» и «IN PARENT», он не печатает никаких промежуточных операторов printf, почему он это делает. Файл, который я пытаюсь запустить, представляет собой простой исполняемый файл, который выводит «hello world» на стандартный вывод.

Спасибо за любую помощь


person Ameya Savale    schedule 21.04.2013    source источник


Ответы (1)


Со страницы руководства:

The exec() functions only return if an error has occurred.

Итак, ваш вызов execvp предположительно работает и, следовательно, не возвращается.

Смысл функций exec в том, что они заменяют текущий код кодом другой программы, поэтому не имеет смысла возвращаться к вашему коду после завершения работы программы.

Редактировать:

Похоже, вы неправильно вызываете свою программу. Я думаю, вы должны называть это так:

char *arg[3] = {"test", (char*) 0};
int value = execvp("/home/ameya/Documents/computer_science/cs170/project1/test", arg);
person Xymostech    schedule 21.04.2013
comment
спасибо, это имеет смысл, и причина, по которой я не вижу вывод hello world, заключается в том, что я не перенаправил вывод из своего дочернего процесса, как я предполагаю? - person Ameya Savale; 22.04.2013
comment
@AmeyaSavale Нет, вы должны видеть вывод ... Вы пытаетесь запустить программу test? - person Xymostech; 22.04.2013
comment
да, я это сделал, и он распечатал привет, мир, у программы есть только основная программа, которая печатает эту строку, разве мне не нужно читать вывод дочернего процесса с помощью каналов? - person Ameya Savale; 22.04.2013
comment
@AmeyaSavale Я имею в виду, из терминала вы пытаетесь запустить test /home/ameya/Documents/computer_science/cs170/project1? Если нет, то что вы используете на терминале? - person Xymostech; 22.04.2013
comment
как только я нахожусь в каталоге, указанном выше, я просто запускаю ./test, и он распечатывает Hello World - person Ameya Savale; 22.04.2013