Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C write()和read()在stdio而不是fifo上不起作用_C_Fifo - Fatal编程技术网

C write()和read()在stdio而不是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

我遇到了与FIFO和
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);
}