C write()和read()在stdio而不是fifo上不起作用
我遇到了与FIFO和C write()和read()在stdio而不是fifo上不起作用,c,fifo,C,Fifo,我遇到了与FIFO和write()和read()函数相关的问题。我通过mkfifo()函数创建fifo,然后使用fork()生成两个进程:第一个进程通过write()打开并写入fifo;另一个打开并读取read()。 我的问题是write()在标准输出上写入,而read()等待我在标准输入上写入内容并按Enter键,就像scanf()一样,因此不使用fifo。我真的不知道该怎么办了,我尝试过任何东西,到目前为止在互联网上还没有发现任何相关的问题。 我正在使用gcc编译器和xubuntu15.10
write()
和read()
函数相关的问题。我通过mkfifo()
函数创建fifo,然后使用fork()
生成两个进程:第一个进程通过write()打开并写入fifo;另一个打开并读取read()。
我的问题是write()
在标准输出上写入,而read()
等待我在标准输入上写入内容并按Enter键,就像scanf()
一样,因此不使用fifo。我真的不知道该怎么办了,我尝试过任何东西,到目前为止在互联网上还没有发现任何相关的问题。
我正在使用gcc编译器和xubuntu15.10
过程生成器
int main (void) {
int f = mkfifo("try", S_IRUSR | S_IWUSR);
if (f < 0)
printf("mkfifo went fine\n");
else
printf("mkfifo went wrong\n");
pid_t fo = fork();
switch (fo) {
case -1:
printf("err\n");
case 0:
execlp("prova_fifo2", "prova_fifo2", NULL);
default:
execlp("prova_fifo", "prova_fifo", NULL);
}
return (0);
}
阅读器(又名prova_fifo2)
注意我包含了所有必要的库,代码编译并运行。我唯一的问题是上面提到的那一个。这是一个问题,表达式fd=open(“try”,O_WRONLY)=-1
相当于fd=(open(“try”,O_WRONLY)=-1)
,这肯定不是你想要的,因为这将把open(…)=-1
的结果分配给fd
,这将是错误的(即0
这是标准输入的文件描述符)如果可以找到文件,如果找不到文件,则1
您需要执行
(fd=open(“try”,O_WRONLY))==-1
您不能在未初始化的字符
数组上明智地调用strlen()
read(fd, buf, sizeof(buf));
相反
请注意,read()
不会以零终止数组,并且printf()
希望在%s
中收到这样的内容,因此您可能希望将整个内容更改为:
char buf[7] = {0};
if ( read(fd, buf, sizeof(buf) - 1) > 0 ) {
printf("READ: %s\n", buf);
}
read(fd,&buf,strlen(buf));
这个buff是非本质化的,如果没有找到0,那么strlen()可能会做可怕的事情。另外:read()可能会在小缓冲区中读取比实际大小更多的关于以if(f<0)
1开头的代码块。如果“f”小于0,则调用mkfifo()失败。在这种情况下,调用:peror(mkfifo失败”);exit(exit_FAILURE);
。因为如果函数失败,代码中没有继续的理由,对peror()
的调用将输出系统认为问题所在的内容。当对execlp()
的调用失败时,调用将返回。因此对execlp()的每次调用
后面应该是这样的内容:perror(“execlp失败”);exit(exit_失败);
这一行:read(fd,&buf,strlen(buf));
应该是:ssize_t bytesread=read(fd,buf,sizeof(buf));buf[bytesread]='\0';
这一行:printf(“错误打开FIFO\n”)
应该是:perrow>打开FIFO时出错\n“;退出(退出失败);
因为代码不应该继续,试图从无法打开的文件中读取。类似的注意事项也适用于这行:printf(“Errore in apertura FIFO\n”);
谢谢!!这就解决了它!太简单了!谢谢,我发布的代码只是一个真正的“巨大”的示例“我正在开发代码。
read(fd, buf, sizeof(buf));
char buf[7] = {0};
if ( read(fd, buf, sizeof(buf) - 1) > 0 ) {
printf("READ: %s\n", buf);
}