C管道多条消息只收到一条

C pipe multiple message only one recieved

我正在尝试从 parent 向接收方发送两条消息。只收到一个。 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;   
}

问题出在 strlen(arr)+1 部分。您还发送了终止 nul,并且 nul 最终构成了 scanf 读取的第二个 "string":

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;   
}

下面一行有一个问题:

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

scanf 不会读取结尾的白色 space(包括换行符),除非与指令匹配。但是指令存在于此处。因此它在输入后的通常换行之后等待另一换行。

删除 scanf 语句中的 \n

其次,您必须修改 fprintf 语句以在其中添加 \n

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

第三,write中的strlen(arr)不要加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