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