2015-04-26 2 views
0

Я пытаюсь понять трубы и использование вилки в С. Ниже приведен пример кода, который вызывает fork(), а затем:C трубы запись/чтение приоритет

  • процесс ребенка: Считывает pipe и печатает содержимое консоли.
  • Родительский процесс: Записывает в pipe «привет мир».

    int main(void) 
    { 
    pid_t pid; 
    int mypipe[2]; 
    
    /* Create the pipe. */ 
    if (pipe(mypipe)) 
    { 
        fprintf(stderr, "Pipe failed.\n"); 
        return EXIT_FAILURE; 
    } 
    /* Create the child process. */ 
    pid = fork(); 
    if (pid == (pid_t)0) 
    { 
        /* This is the child process. 
        Close other end first. */ 
        close(mypipe[1]); 
        read_from_pipe(mypipe[0]);//read pipe and print the result to console 
        return EXIT_SUCCESS; 
    } 
    else if (pid < (pid_t)0) 
    { 
        /* The fork failed. */ 
        fprintf(stderr, "Fork failed.\n"); 
        return EXIT_FAILURE; 
    } 
    else 
    { 
        /* This is the parent process. 
        Close other end first. */ 
        close(mypipe[0]); 
        write_to_pipe(mypipe[1]);//write "hello world" to the pipe 
        return EXIT_SUCCESS; 
    } 
    } 
    

Я понимаю, что мы используем pipes, которые рассматриваются как файлы, так что дочерний процесс и родительский процесс может общаться. (Правильно ли это?) Теперь, поскольку труба используется как из родителя, так и из ребенка, будет ли ребенок читать пустой pipe? Или будет pipe «Привет, мир»? И почему ? Я предполагаю, что он случайный, так как дочерний и родительский процессы выполняются одновременно. Это правда ?

ответ

2

В соответствии с man 7 pipe «Если процесс пытается прочитать из пустого канала, тогда чтение (2) будет блокироваться до тех пор, пока не будут доступны данные».

Так что, если read встречается до write, он будет ждать, пока закончится write.

Взаимный, если read возникает после write, это очевидно, что оно вернет сообщение.

И по крайней мере один из этих случаев должно быть правдой, потому что, по-прежнему в соответствии с man 7 pipe, «POSIX.1-2001 говорит, что запись (2) s меньше, чем байт PIPE_BUF должен быть атомарным», и PIPE_BUF, как правило, большой достаточно, чтобы провести гораздо больше, чем «Hello World».

Таким образом, read вернет «Привет мир».

+0

ОК, если 'pipe' не был пуст, когда вызывалась' fork'? – dimitris93

+0

Затем прочитанное будет возвращать (самое большее, в зависимости от размера буфера) то, что находится в трубе, и не будет ждать больше. – Ekleog

+0

Как вы знаете, что 'read' произойдет до' write'. Родительский и дочерний процессы выполняются одновременно правильно? Итак, не будет ли случай «читать» случайным? – dimitris93