FIFO写管道fd = open(FIFO_SERVER, O_WRONLY | O_NONBLOCK,0);出现错误

这是代码段
clipboard.png

这是出现的错误,提示FIFO_SERVER没有定义
clipboard.png
请求帮助!!!

阅读 5.5k
3 个回答

因为系统默认的fifo权限是000, 所以你需要先修改权限再open
完整的代码如下

read

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

#define FIFO_SERVER "/tmp/myfifo"

main(int argc, char** argv) {
    char buf_r[100];
    int fd;
    int nread;
    if ((mkfifo(FIFO_SERVER, O_CREAT | O_EXCL |O_RDWR) < 0) && (errno != EEXIST))
    {
        perror("can not creat fifoserver");
        exit(1);
    }

    char cmd[100];
    sprintf(cmd, "chmod 704 %s", FIFO_SERVER);
    system(cmd);

    printf("preparing for reading bytes...\n");
    memset(buf_r, 0, sizeof(buf_r));
    fd = open(FIFO_SERVER, O_RDONLY | O_NONBLOCK, 0);
    if (fd == -1) {
        perror("open");
        exit(1);
    }
    while (1)
    {
        memset(buf_r, 0, sizeof(buf_r));
        if ((nread = read(fd, buf_r, 100)) == -1) {
            if (errno == EAGAIN)
                printf("no data yet\n");
        }
        printf("read %s from FIFO\n", buf_r);
        sleep(1);
    }
//    pause();
    close(fd);
    unlink(FIFO_SERVER);
}

write

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

#define FIFO_SERVER "/tmp/myfifo"

int main(int argc, char** argv)
{
    int fd;
    char w_buf[100];
    int nwrite;

    fd = open(FIFO_SERVER, O_WRONLY | O_NONBLOCK,0);
    if (fd == -1)
    {
        perror("open error;no reading process");
        exit(1);
    }
    if (argc == 1)
    {
        printf("please send somenthing\n");
        exit(1);
    }
    strcpy(w_buf, argv[1]);
    if ((nwrite = write(fd, w_buf, 100)) == -1)
    {
        if (errno == EAGAIN)
            printf("the fifo has not been read yet.Please try later\n");
    }
    else
        printf("write %s to the fifo\n", w_buf);
    close(fd);
    return 0;
}

运行

先运行reader, 再运行writer

reader

harriszh Fri 1:03@ ~/trunk/cpp/fifo3$ ./read
preparing for reading bytes...
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read abc from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read abc from FIFO
read  from FIFO
read  from FIFO
read  from FIFO
read  from FIFO

writer

harriszh Fri 1:03@ ~/trunk/cpp/fifo3$ ./write abc
write abc to the fifo
harriszh Fri 1:03@ ~/trunk/cpp/fifo3$ ./write "abc"
write abc to the fifo

open函数
clipboard.png 摘自linux程序设计第三章
FIFO
clipboard.png 摘自linux程序设计第十三章
你这一段代码应该是在别的地方有FIFO_SERVER(FIFO文件的路径)的定义

------补充
就你这边的代码看你如果#define FIFO_SERVER "/tmp/myfifo" 在这个目录下你有一个myfifo 的管道文件
错误原因是core dump 应该是你在这个地方没有这个文件吧.

现在上面的问题解决了,但是没有出现预期的结果

clipboard.png

#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO "/tmp/myfifo"
main(int argc, char** argv)
{
    int fd;
    char w_buf[100];
    int nwrite;
    if (fd == -1)
        if (errno == ENXIO)
            printf("open errop;no reading process\n");
    fd = open(FIFO_SERVER, O_WRONLY | O_NONBLOCK,0);
    if (argc == 1)
        printf("please send somenthing\n");
    strcpy(w_buf, argv[1]);
    if ((nwrite = write(fd, w_buf, 100)) == -1)
    {
        if (errno == EAGAIN)
            printf("the fifo has not been read yet.Please try later\n");
    }
    else
        printf("write %s to the fifo\n", w_buf);
}
这是完整的代码?不知道哪里出现了错误
在打开终端进行读操作的时候显示

clipboard.png
下面是读的代码:

#include<sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define FIFO_SERVER "/tmp/myfifo"
main(int argc, char** argv) {
    char buf_r[100];
    int fd;
    int nread;
    if ((mkfifo(FIFO_SERVER, O_CREAT | O_EXCL) < 0) && (errno != EEXIST))
        printf("can not creat fifoserver\n");
    printf("preparing for reading bytes...\n");
    memset(buf_r, 0, sizeof(buf_r));
    fd = open(FIFO_SERVER, O_RDONLY | O_NONBLOCK, 0);
    if (fd == -1) {
        perror("open");
        exit(1);
    }
    while (1)
    {
        memset(buf_r, 0, sizeof(buf_r));
        if ((nread = read(fd, buf_r, 100)) == -1) {
            if (errno == EAGAIN)
                printf("no data yet\n");
        }
        printf("read %s from FIFO\n", buf_r);
        sleep(1);
    }
    pause();
    unlink(FIFO_SERVER);
}

这是一个终端执行第一段代码,写没有错误提示
clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题