我想创建一个由两个通过管道进行通信的进程组成的系统。第一个进程读取文件的内容并将其写入管道,而第二个进程在终端上打印出来。我编写程序但接收器进程在文件有多行时没有正确接收数据。它会在每次迭代时从行的开头删除一个字符。有任何线索请解决这个问题
p1代码
#define BUFFER_SIZE 10
#define NAMED_PIPE "./namedpipe"
void main(int argc, char *argv[])
{
if (argc != 2)
{
printf("The usage of this program is:\n");
printf("execute cmd.txt\n");
return;
}
/* initialize the pipe and fork variables */
int fd;
char *infile = argv[1];
char buffer[BUFFER_SIZE];
FILE *in;
in = fopen(infile, "r");
if (in == NULL)
{
fprintf(stderr, "Error opening file %s\n", infile);
return;
}
fd = open(NAMED_PIPE, O_WRONLY);
while (fscanf(in,"%s",buffer)>0)
{
write(fd, buffer, (strlen(buffer)+1));
}
fclose(in);
}
而p2
#define BUFFER_SIZE 10
#define NAMED_PIPE "./namedpipe"
int main()
{
int fd,ret;
char buffer[BUFFER_SIZE];
ret=mkfifo(NAMED_PIPE,0666);
if (ret == -1)
{
printf("Error creating the named pipe");
exit (1);
}
fd = open(NAMED_PIPE, O_RDONLY);
while(1)
{
if (read(fd, buffer, sizeof(buffer)) > 0)
{
printf("read [%s]\n",buffer);
}
else
return;
}
}
答案 0 :(得分:0)
您可以定义10个字符的缓冲区,并使用fscanf
读取输入文件。 RTFM fscanf
将用于格式化输入,永远不会使用原始%s
输入文本,但始终将输入的大小限制为字段大小。在这里,至少"%9s"
留下一个地方来终止null。
但事实上,为了阅读未格式化的文本,正确的函数是fgets
。所以在pt1中你应该有:
fd = open(NAMED_PIPE, O_WRONLY);
while (fgets(buffer, sizeof(buffer), in) != NULL)
{
write(fd, buffer, (strlen(buffer)));
}
close(fd);
fclose(in);
}
在pt2中,你应该留一个终止null的地方并手动添加它,因为只读读取字节并给你字节数。你至少应该写:
while(1)
{
if ((ret = read(fd, buffer, sizeof(buffer) - 1)) > 0)
{
buffer[ret] = '\0';
printf("read [%s]\n",buffer);
}
else
return;
}