Execlp не работает, если я не гриппа sh буфер - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь запустить команду в дочернем процессе в C:

int main()
{
    if (fork()) {
        wait(0);
    } else {
        fflush(stdout);
        execlp("ls", "ls");
        printf("Command not found: \"%s\"\n", "ls");
    }   
}

Насколько я понимаю, вызов fork() создаст клон процесса (дочерний) , Родитель здесь будет wait(0), потому что fork() не возвращает ноль и ждет завершения дочернего процесса.

Я понимаю, что "образ дочернего процесса" по существу "становится" ls после вызов execlp("ls", "ls");.

На этом этапе, если в пути существует ls, программа ls вступает во владение и никогда не следует вызывать printf() в строке 8.

Это работает, как и ожидалось, с фрагментом, который я выложил выше, и я получаю вывод ls в текущем каталоге.

Однако, если я закомментирую fflush(stdout), printf() вызывается!

Command not found: "ls"

Почему вызывается printf(), если я комментирую fflush(stdout)?

1 Ответ

0 голосов
/ 01 апреля 2020

следующий предложенный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. правильно проверяет ошибки
  4. для любой ошибки, правильно передает «ваше» сообщение об ошибке и текстовую причину, по которой система считает, что ошибка произошла, stderr
  5. передает действительный список параметров в execlp()
  6. документы, почему каждый заголовочный файл включен
  7. использует действительную подпись, как определено в стандарте языка программирования C, для функции main()
  8. не делает предположений относительно значения, возвращаемого из fork()
  9. следует аксиоме: только один оператор на строку и (самое большее) одно объявление переменной на оператор.

и теперь предложенный код:

#include <stdio.h>    // perror(), printf()
#include <stdlib.h>   // exit(), EXIT_FAILURE
#include <unistd.h>   // execlp(), fork(), pid_t
#include <sys/wait.h> // wait()


int main( void )
{
    pid_t pid = fork();

    if ( pid < 0 ) 
    {   // then error
        perror( "fork failed" );
        exit( EXIT_FAILURE );
    }

    if( pid == 0 )
    {   // then child
        execlp("ls", "ls", NULL );
        perror( "execlp failed" );
        exit( EXIT_FAILURE );
    }

    else
    {   // then parent
        wait(0);
    } 
}
...