命名PIPE(FIFO)读取C中文件的内容

时间:2017-10-19 09:01:19

标签: c pipe named-pipes fifo

基本上我希望我的客户端程序从文件中读取数据(在命令行输入中指定的文件名/路径)并将该数据复制到FIFO中,我希望我的服务器程序从FIFO读取并打印每一行。

例如,如果我想打印/ etc / passwd文本文件的内容,我就这样在终端中运行程序:

./server &
./client < /etc/passwd

但是,它不是打印任何输出,而是打印出“完成”之外的任何内容。 为什么呢?
这是我的代码:
server.c

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

#define FIFONAME "myfifo"

int main(void){

    int n,fd;
    char buffer[1024];
    unlink(FIFONAME);

    //create FIFO

    if(mkfifo(FIFONAME,0666)<0){
        perror("server: mkfifo");
        exit(1);
    }
    //open FIFO for reading
    if((fd = open(FIFONAME, O_RDONLY))<0){
        perror("server: open");
        exit(1);
    }
    //READ from fifo UNTIL end of tile and print 
    //what we get on the standard input
    while((n=read(fd,buffer,sizeof(buffer)))>0){
        write(1, buffer, n);
    }

    close(fd);
    exit(0);
}


client.c

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

#define FIFONAME "myfifo"

int main(void){

    int n,fd;
    char buffer[1024];

    /* open, read, and display the message from the FIFO */
    if((fd = open(FIFONAME, O_WRONLY))<0){
        perror("client: open");
        exit(1);
    }
    //read from standard input and copy data to the FIFO
    while (fgets(buffer, sizeof(buffer), stdin) != 0){
        fgets(buffer, sizeof(buffer), stdin);
        write(fd, buffer, n);
    }


    close(fd);
    exit(0);
}

1 个答案:

答案 0 :(得分:2)

这段代码错了:

 while (fgets(buffer, sizeof(buffer), stdin) != 0){
        fgets(buffer, sizeof(buffer), stdin);
        write(fd, buffer, n);

此循环使用输入,然后再次读取。你正在失去第一个(也可能是唯一的)buffer。我会这样做(也许不是最好的代码,但有效):

 while (1){
        if (fgets(buffer, sizeof(buffer), stdin)==0) break;
        write(fd, buffer, n);
 }

除此之外,正如我的评论中所述,在后台运行服务器以创建FIFO并运行客户端而不等待创建FIFO是一种潜在的竞争条件。