Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1184889
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: C/C++

2015-12-02 16:19:00


点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <fcntl.h>
  3. #include <errno.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>

  7. #define MSG_TRY "try again\n"

  8. void set_fl(int fd, int flags);
  9. void clr_fl(int fd, int flags);

  10. int main(int argc, char * * argv)
  11. {

  12.         printf("fcntl的操作命令cmd:\n");
  13.         printf("cmd[F_DUPFD]=[%d]\n", F_DUPFD);
  14.         printf("cmd[F_GETFD]=[%d]\n", F_GETFD);
  15.         printf("cmd[F_SETFD]=[%d]\n", F_SETFD);
  16.         printf("cmd[F_GETFL]=[%d]\n", F_GETFL);
  17.         printf("cmd[F_SETFL]=[%d]\n", F_SETFL);
  18.         printf("cmd[F_GETOWN]=[%d]\n", F_GETOWN);
  19.         printf("cmd[F_SETOWN]=[%d]\n", F_SETOWN);
  20.         printf("cmd[F_GETLK]=[%d]\n", F_GETLK);
  21.         printf("cmd[F_SETLK]=[%d]\n", F_SETLK);
  22.         printf("cmd[F_SETLKW]=[%d]\n", F_SETLKW);
  23.     
  24.         printf("fcntl的文件状态标志:\n");
  25.         printf("只读打开 [O_RDONLY]=[%d]\n", O_RDONLY);
  26.         printf("只写打开 [O_WRONLY]=[%d]\n", O_WRONLY);
  27.         printf("为读写打开 [O_RDWR]=[%d]\n", O_RDWR);
  28.         printf("每次写时追加 [O_APPEND]=[%d]\n", O_APPEND);
  29.         printf("非阻塞模式 [O_NONBLOCK]=[%d]\n", O_NONBLOCK);
  30.         printf("等待写完成(数据和属性)[O_SYNC]=[%d]\n", O_SYNC);
  31.         printf("等待写完成(仅数据)[O_DSYNC]=[%d]\n", O_DSYNC);
  32.         printf("同步读写 [O_RSYNC]=[%d]\n", O_RSYNC);
  33.         printf("等待读写完成 [O_FSYNC]=[%d]\n", O_FSYNC);
  34.         printf("异步IO [O_ASYNC]=[%d]\n", O_ASYNC);
  35.         printf(" [O_CREAT]=[%d]\n", O_CREAT);
  36.         printf(" [O_EXCL]=[%d]\n", O_EXCL);
  37.         printf(" [O_TRUNC]=[%d]\n", O_TRUNC);
  38.         printf(" [O_NOCTTY]=[%d]\n", O_NOCTTY);
  39.         printf("访问模式屏蔽字[O_ACCMODE]=[%d]\n", O_ACCMODE);
  40.     
  41.         char buf[10];
  42.         int ret;
  43.         int len;
  44.         int flags;
  45.         flags = fcntl(STDIN_FILENO, F_GETFL); //获得标准输入文件的状态
  46.         printf("标准输入文件的默认文件状态标志=[%d]\n", flags);
  47.         
  48.         switch(flags & O_ACCMODE) //只取得访问模式位
  49.         {
  50.                 case O_RDONLY:
  51.                 {
  52.                         printf("标准输入文件 有只读方式\n");
  53.                         break;
  54.                 }
  55.                 case O_WRONLY:
  56.                 {
  57.                         printf("标准输入文件 有只写方式\n");
  58.                         break;
  59.                 }
  60.                 case O_RDWR:
  61.                 {
  62.                         printf("标准输入文件 有读写方式\n");
  63.                         break;
  64.                 }
  65.         }
  66.         if(flags & O_APPEND) //判断是否有追加状态
  67.         {
  68.                 printf("标准输入文件 有写时追加方式\n");
  69.         }
  70.         if(flags & O_NONBLOCK)
  71.         {
  72.                 printf("标准输入文件 有非阻塞方式\n");
  73.         }
  74.         
  75.         set_fl(STDIN_FILENO, O_NONBLOCK); //设置标准输入文件非阻塞模式
  76.         
  77.         //clr_fl(STDIN_FILENO, O_NONBLOCK); //清除标准输入文件非阻塞模式
  78.         
  79.         tryagain:
  80.         len = read(STDIN_FILENO, buf, 10);
  81.         printf("read len = [%d]\n", len);
  82.         if(len < 0)
  83.         {
  84.                 if (errno == EAGAIN) //提示你的应用程序现在没有数据可读请稍后再试。
  85.                 {
  86.                         sleep(1);
  87.                         write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
  88.                         goto tryagain;
  89.                 }
  90.                 perror("read stdin");
  91.                 exit(1);
  92.         }
  93.         write(STDOUT_FILENO, buf, len);
  94.         
  95.         return 0;
  96. }



  97. /*
  98. 对一个文件描述符关闭一个文件状态标志
  99. 如:clr_fl(STDOUT_FILENO, O_SYNC); 关闭标准输出文件的同步写标志
  100. */
  101. void clr_fl(int fd, int flags)
  102. {
  103.         int val;
  104.         int ret;
  105.         //val = fcntl(fd, F_GETFL, 0);
  106.         val = fcntl(fd, F_GETFL);
  107.         if(val < 0)
  108.         {
  109.                 printf("fcntl F_GETFL err!\n");    
  110.                 return;
  111.         }
  112.     val &= ~flags; /* turn flags off */

  113.         ret = fcntl(fd, F_SETFL, val);
  114.         if(val < 0)
  115.         {
  116.                 printf("fcntl F_SETFL err!\n");    
  117.                 return;
  118.         }
  119.     return;
  120. }



  121. /*
  122. 对一个文件描述符打开一个文件状态标志
  123. 如:set_fl(STDOUT_FILENO, O_SYNC); 打开标准输出文件的同步写标志
  124. */
  125. void set_fl(int fd, int flags)
  126. {
  127.         int val;
  128.         int ret;
  129.         //val = fcntl(fd, F_GETFL, 0);
  130.         val = fcntl(fd, F_GETFL);
  131.         if(val < 0)
  132.         {
  133.                 printf("fcntl F_GETFL err!\n");    
  134.                 return;
  135.         }
  136.         val |= flags;
  137.         
  138.         ret = fcntl(fd, F_SETFL, val);
  139.         if(val < 0)
  140.         {
  141.                 printf("fcntl F_SETFL err!\n");    
  142.                 return;
  143.         }
  144.         return;
  145. }



  146. /*
  147. 在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)
  148. 从字面上来看,是提示再试一次。
  149. 这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。

  150. 例如,以O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。
  151. 此时程序不会阻塞起来等待数据准备就绪返回,read函数会返回一个错误EAGAIN,
  152. 提示你的应用程序现在没有数据可读请稍后再试。

  153. 又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,
  154. 返回EAGAIN提示其再调用一次(也许下次就能成功)
  155. */

阅读(462) | 评论(0) | 转发(0) |
0

上一篇:status用法

下一篇:fflush函数

给主人留下些什么吧!~~