如何在C中写入和读取命名管道?

myt*_*hic 8 c named-pipes

我有2个程序(write.c和read.c).我想从标准输入连续写入命名管道,并在另一端读取它(并写入标准输出).我做了一些工作,但它没有正常工作.另一端的程序以错误的顺序读取或读取特殊字符(因此它读取的内容需要更多?).我还希望能够将命名管道输出与某个字符串进行比较.

无论如何,这是两个文件的代码:

为write.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;

    char buf[BUFFSIZE];


    mkfifo("fifo_x", 0666);
    if ( (fd = open("fifo_x", O_WRONLY)) < 0)
        err("open")

    while( (n = read(STDIN_FILENO, buf, BUFFSIZE) ) > 0) {
        if ( write(fd, buf, strlen(buf)) != strlen(buf)) { 
            err("write");
        }
    }
    close(fd);
}
Run Code Online (Sandbox Code Playgroud)

read.c:

#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;
    char buf[BUFFSIZE];

    if ( (fd = open("fifo_x", O_RDONLY)) < 0)
        err("open")


    while( (n = read(fd, buf, BUFFSIZE) ) > 0) {

        if ( write(STDOUT_FILENO, buf, n) != n) { 
            exit(1);
        }
    }
    close(fd);
}
Run Code Online (Sandbox Code Playgroud)

输入示例:

hello how are you
123 
test
Run Code Online (Sandbox Code Playgroud)

输出错误的示例:

hello how are you
b123
o how are you
btest
 how are you
b
Run Code Online (Sandbox Code Playgroud)

输入的另一个例子:

test
hi
Run Code Online (Sandbox Code Playgroud)

并输出:

test
hi
t
Run Code Online (Sandbox Code Playgroud)

Sta*_*eur 5

通过read修改的缓冲区不是有效的c字符串

write(fd, buf, strlen(buf)) != strlen(buf) // write.c
Run Code Online (Sandbox Code Playgroud)

是未定义的行为.你应该做

write(fd, buf, n) != n
Run Code Online (Sandbox Code Playgroud)

因为你读了n八位字节read().

这很有趣,因为你是为read.c而不是为write.c做的


该类型的n必备,但ssize_t并没有int,人阅读.


main()必须返回一个int Declare主要原型

  • 哇,一开始我实际上是正确的,但是天知道是什么原因改变了它..谢谢。 (2认同)