当我遇到此错误时,我正在尝试测试命名管道。 我有一个名为client.c的文件,它会写入命名管道。 我有一个名为server.c的文件,该文件从命名管道读取并打印其值。 看起来server.c有问题
客户代码。
//-------CLIENT-----------
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define FIFO_FILE "MYFIFO"
int main()
{
int fd, ch;
char readbu[80];
int write_byte;
fd=open(FIFO_FILE,O_WRONLY);
while(1)
{
printf("Enter choice \n1.Pepsi\n2.Coke\n3.Limca\n4.Maza\n");
scanf("%d",&ch);
switch(ch)
{
case 1: strcpy(readbu,"Pepsi\0");
write_byte=write(fd,readbu,sizeof(readbu));
break;
case 2: strcpy(readbu,"Coke\0");
write_byte=write(fd,readbu,sizeof(readbu));
break;
case 3: strcpy(readbu,"Limca\0");
write_byte=write(fd,readbu,sizeof(readbu));
break;
case 4: strcpy(readbu,"Maza\0");
write_byte=write(fd,readbu,sizeof(readbu));
break;
default:printf("Invalid");
break;
}
}
return 0;
}
服务器代码:
// Server code
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define FIFO_FILE "MYFIFO"
int main()
{
int fd;
char readbuf[80];
char end[10];
int to_end;
int read_bytes;
mknod(FIFO_FILE,S_IFIFO|0640,0);
strcpy(end,"end");
while(1)
{
fd=open(FIFO_FILE,O_RDONLY);
read_bytes=read(fd,readbuf,sizeof(readbuf));
readbuf[read_bytes]='\0';
printf("Rec str = %s of len %d", readbuf,(int)strlen(readbuf));
to_end=strcmp(readbuf,end);
if(to_end==0)
{ close(fd);
break;
}`enter code here`
}
return 0;
}
在服务器端,上述代码不打印任何输出。
如果我将printf语句更改为以下内容,那么我观察到第一次迭代将打印空白行,然后对于其他迭代将打印旧值。
printf("\nRec str = %s of len %d", readbuf,(int)strlen(readbuf));
如果我将printf语句更改为以下内容,那么我发现它会打印正确的值。
printf("Rec str = %s of len %d\n", readbuf,(int)strlen(readbuf));
我对\ n产生如此大的差异感到完全困惑。
我尝试使用gdb检查readbuf中的值,它实际上包含正确的值。 请帮助我理解这里的技巧。
答案 0 :(得分:2)
通常在输出缓冲区已满,插入换行符或显式fflush( stdout )
调用之前,通常不会刷新输出缓冲区。
在输出的开头有换行符时,它将刷新先前缓冲的数据,并缓冲以下数据。
以下内容将解决该问题:
printf("\nRec str = %s of len %d", readbuf,(int)strlen(readbuf));
fflush( stdout ) ;