我正在尝试从父级向接收者发送两条消息。只收到一个。接收器使用 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;
}

最佳答案

一个问题是以下行:

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

除非与指令匹配,否则 scanf 不会读取尾随空格(包括换行符)。但是该指令存在于此处。所以它在输入后面的通常的新行之后等待另一个新行。

删除两个 \n 语句中的 scanf

其次,您必须修改 fprintf 语句以在其中添加 \n
fprintf(stderr,"REC: %s\n",buffer);

第三,不要在 strlen(arr) 中的 write 上加 1。修改为:
write(pipes[1],arr,strlen(arr));

有用。见 live demo :

输出:
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

关于C管道多条消息只收到一条,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52401416/

10-10 13:49