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
我正在尝试从 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