|
|
我想创建一个有名管道,然后父进程写入“hello world”,子进程从管道中读出,并打印出来
但是在open()的时候发生了问题,父进程挂起,子进程提示EACCES(参数pathname所指的文件不符合所要求测试的权限)
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <errno.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <string.h>
- #include <unistd.h>
- #define FIFO_SERVER "/tmp/fifoserver"
- main(int argc,char** argv)
- {
- int fd;
- char w_buf[1024] = "hello world";
- char r_buf[1024];
- int real_wnum;
- memset(w_buf,0,1024);
- if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
- printf("cannot create fifoserver\n");
- if(fd==-1)
- if(errno==ENXIO)
- printf("open error; no reading process\n");
- if(fork() > 0)
- {
- if ((fd = open(FIFO_SERVER,O_WRONLY,0)) < 0) // hand up on open()
- {
- printf("parent open error\n");
- if(EEXIST == errno)printf("pEEXIST\n");
- if(EACCES == errno)printf("pEACCES\n");
- if(EROFS == errno)printf("pEROFS\n");
- if(EFAULT == errno)printf("pEFAULT\n");
- if(EINVAL == errno)printf("pEINVAL\n");
- if(ENAMETOOLONG == errno)printf("pENAMETOOLONG\n");
- if(ENOTDIR == errno)printf("pENOTDIR\n");
- if(ENOMEM == errno)printf("pENOMEM\n");
- if(ELOOP == errno)printf("pELOOP\n");
- if(EIO == errno)printf("pEIO\n");
- }
- real_wnum=write(fd,w_buf,15);
- if(real_wnum==-1)
- {
- if(errno==EAGAIN)
- printf("write to fifo error; try later\n");
- }else{
- printf("real write num is %d\n",real_wnum);
- }
- }else{
- if ((fd = open(FIFO_SERVER,O_RDONLY,0)) < 0)
- {
- printf("child open error\n");
- if(EEXIST == errno)printf("cEEXIST\n");
- if(EACCES == errno)printf("cEACCES\n");// the errno happen
- cEACCES
- if(EROFS == errno)printf("cEROFS\n");
- if(EFAULT == errno)printf("cEFAULT\n");
- if(EINVAL == errno)printf("cEINVAL\n");
- if(ENAMETOOLONG == errno)printf("cENAMETOOLONG\n");
- if(ENOTDIR == errno)printf("cENOTDIR\n");
- if(ENOMEM == errno)printf("cENOMEM\n");
- if(ELOOP == errno)printf("cELOOP\n");
- if(EIO == errno)printf("cEIO\n");
- }
- read(fd, r_buf, 100);
- printf("%s\n", r_buf);
- }
- }
复制代码
题目打错了,应为FIFO |
|