C труба несколько сообщений только одно получено - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь отправить два сообщения от родителя получателю.Только один получен.Receiver использует stdin и stdout для канала и выводит свои результаты в std err.Вот мой код.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main(int argc,char * argv[])
{
    char buffer[100]; // The pipe's buffer
    int pipes[2];

    pid_t   childpid;

    if ( pipe(pipes) ){
        fprintf(stderr,"FATAL ERROR IN PIPE");
    }


    if((childpid = fork()) == -1){
            perror("fork");
            exit(1);
    }

    if(childpid == 0){
        close(pipes[1]);

        dup2(pipes[0],STDIN_FILENO);

        scanf("%s\n",buffer);
        fprintf(stderr,"REC: %s\n",buffer);
        scanf("%s\n",buffer);
        fprintf(stderr,"REC: %s\n",buffer);
        sleep(50);
    }
    else
    {
        close(pipes[0]);

        // Read in a string from the pipe 
        char* arr = "HelloWorld\n";
        write(pipes[1],arr,strlen(arr)+1);
        write(pipes[1],arr,strlen(arr)+1);  
        sleep(50);
    }
    return 0;   
}

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Одна проблема связана со следующей строкой:

scanf("%s\n",buffer);

scanf не читает конечный пробел (включая символы новой строки), если это не соответствует директиве.Но директива существует здесь.Таким образом, он ждет другой новой строки после обычной новой строки, которая следует за вводом.

Удалите \n в обоих операторах scanf.

Во-вторых, вам нужно изменить свой fprintf операторов для добавления \n в них.

fprintf(stderr,"REC: %s\n",buffer);

В-третьих, не добавляйте 1 к strlen(arr) в write.Измените его на:

write(pipes[1],arr,strlen(arr));

Работает.См. live демо :

Вывод:

REC: HelloWorld
REC: HelloWorld

Real time: 2.082 s
User time: 0.043 s
Sys. time: 0.037 s
CPU share: 3.85 %
Exit code: 0
0 голосов
/ 19 сентября 2018

Проблема в части strlen(arr)+1.Вы также отправляете завершающий nul, и этот nul в итоге составляет вторую "строку", прочитанную scanf:

REC: HelloWorld
REC: 

Если вы удалите +1, вы 'я получу обе строки (я также уменьшил время сна, потому что я не достаточно терпелив, чтобы ждать результата 50 секунд):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int main(int argc,char * argv[])
{
    char buffer[100]; // The pipe's buffer
    int pipes[2];

    pid_t   childpid;

    if ( pipe(pipes) ){ fprintf(stderr,"FATAL ERROR IN PIPE"); }
    if((childpid = fork()) == -1){ perror("fork"); exit(1); }

    if(childpid == 0){
        close(pipes[1]);

        dup2(pipes[0],STDIN_FILENO);

        scanf("%s\n",buffer);
        fprintf(stderr,"REC: %s\n",buffer);
        scanf("%s\n",buffer);
        fprintf(stderr,"REC: %s\n",buffer);
        sleep(2);
    }
    else
    {
        close(pipes[0]);

        // Read in a string from the pipe 
        char* arr = "HelloWorld\n";
        write(pipes[1],arr,strlen(arr)); // << NO +1 
        write(pipes[1],arr,strlen(arr)); // << NO +1
        sleep(2);
    }
    return 0;   
}
...