LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 874|回复: 0

open FILO出错

[复制链接]
发表于 2006-9-25 13:02:33 | 显示全部楼层 |阅读模式
我想创建一个有名管道,然后父进程写入“hello world”,子进程从管道中读出,并打印出来
但是在open()的时候发生了问题,父进程挂起,子进程提示EACCES(参数pathname所指的文件不符合所要求测试的权限)



  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <errno.h>
  4. #include <fcntl.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #define FIFO_SERVER "/tmp/fifoserver"

  9. main(int argc,char** argv)
  10. {
  11. int fd;
  12. char w_buf[1024] = "hello world";
  13. char r_buf[1024];
  14. int real_wnum;
  15. memset(w_buf,0,1024);
  16. if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST))
  17.       printf("cannot create fifoserver\n");

  18. if(fd==-1)
  19.       if(errno==ENXIO)
  20.            printf("open error; no reading process\n");

  21. if(fork() > 0)
  22. {
  23.       if ((fd = open(FIFO_SERVER,O_WRONLY,0)) < 0) // hand up on open()
  24.       {
  25.                         printf("parent open error\n");
  26.   if(EEXIST == errno)printf("pEEXIST\n");
  27.   if(EACCES == errno)printf("pEACCES\n");
  28.   if(EROFS == errno)printf("pEROFS\n");
  29.   if(EFAULT == errno)printf("pEFAULT\n");
  30.   if(EINVAL == errno)printf("pEINVAL\n");
  31.   if(ENAMETOOLONG == errno)printf("pENAMETOOLONG\n");
  32.   if(ENOTDIR == errno)printf("pENOTDIR\n");
  33.   if(ENOMEM == errno)printf("pENOMEM\n");
  34.   if(ELOOP == errno)printf("pELOOP\n");
  35.   if(EIO == errno)printf("pEIO\n");

  36.       }
  37.       real_wnum=write(fd,w_buf,15);
  38.       if(real_wnum==-1)
  39.       {
  40.            if(errno==EAGAIN)
  41.                 printf("write to fifo error; try later\n");
  42.       }else{
  43.             printf("real write num is %d\n",real_wnum);
  44.       }
  45. }else{
  46.          if ((fd = open(FIFO_SERVER,O_RDONLY,0)) < 0)
  47.   {
  48.                 printf("child open error\n");
  49.   if(EEXIST == errno)printf("cEEXIST\n");
  50.   if(EACCES == errno)printf("cEACCES\n");// the errno happen
  51. cEACCES
  52.   if(EROFS == errno)printf("cEROFS\n");
  53.   if(EFAULT == errno)printf("cEFAULT\n");
  54.   if(EINVAL == errno)printf("cEINVAL\n");
  55.   if(ENAMETOOLONG == errno)printf("cENAMETOOLONG\n");
  56.   if(ENOTDIR == errno)printf("cENOTDIR\n");
  57.   if(ENOMEM == errno)printf("cENOMEM\n");
  58.   if(ELOOP == errno)printf("cELOOP\n");
  59.   if(EIO == errno)printf("cEIO\n");

  60.     }
  61.       read(fd, r_buf, 100);
  62.       printf("%s\n", r_buf);
  63. }
  64. }
复制代码


题目打错了,应为FIFO
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表