免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4042 | 回复: 9
打印 上一主题 下一主题

[函数] 阻塞模式与非阻塞模式的设置 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-24 14:00 |只看该作者 |倒序浏览
不考虑select poll等
阻塞→非阻塞
        int flags = fcntl(clifd, F_GETFL, 0);
        fcntl(clifd, F_SETFL, flags | O_NONBLOCK);   

非阻塞→阻塞
有什么办法么  
看了下fcntl的说明 没看到有可设置回来的参数

论坛徽章:
0
2 [报告]
发表于 2008-09-24 14:10 |只看该作者
int flags = fcntl(clifd, F_GETFL, 0);
        fcntl(clifd, F_SETFL, flags & (!O_NONBLOCK));

我猜想的

[[i] 本帖最后由 5毛党党员 于 2008-9-24 14:11 编辑 [/i]]

论坛徽章:
0
3 [报告]
发表于 2008-09-24 14:13 |只看该作者
先GET,把标志记下来,再SET回去就行了。。

论坛徽章:
0
4 [报告]
发表于 2008-09-24 14:14 |只看该作者
试试先  呵呵

论坛徽章:
0
5 [报告]
发表于 2008-09-24 14:14 |只看该作者
原帖由 5毛党党员 于 2008-9-24 14:10 发表
int flags = fcntl(clifd, F_GETFL, 0);
        fcntl(clifd, F_SETFL, flags & (!O_NONBLOCK));

我猜想的



有戏,其实这个常量只是一个预定义的数值而已,用|把某位置1,那么就用&把某位置0.

论坛徽章:
0
6 [报告]
发表于 2008-09-24 14:21 |只看该作者
thx 测试成功  

我看了下头文件里的定义
  5 #define O_ACCMODE         0003                      5 #define O_ACCMODE         0003
  6 #define O_RDONLY            00                      6 #define O_RDONLY            00
  7 #define O_WRONLY            01                      7 #define O_WRONLY            01
  8 #define O_RDWR              02                      8 #define O_RDWR              02
  9 #define O_CREAT           0100  /* not fcntl *      9 #define O_CREAT           0100  /* not fcntl */
10 #define O_EXCL            0200  /* not fcntl *     10 #define O_EXCL            0200  /* not fcntl */
11 #define O_NOCTTY          0400  /* not fcntl *     11 #define O_NOCTTY          0400  /* not fcntl */
12 #define O_TRUNC          01000  /* not fcntl *     12 #define O_TRUNC          01000  /* not fcntl */
13 #define O_APPEND         02000                     13 #define O_APPEND         02000
14 #define O_NONBLOCK       04000                     14 #define O_NONBLOCK       04000
15 #define O_NDELAY        O_NONBLOCK                 15 #define O_NDELAY        O_NONBLOCK
16 #define O_SYNC          010000                     16 #define O_SYNC          010000


可以解释下猜的思路不么? 呵呵

论坛徽章:
0
7 [报告]
发表于 2008-09-24 14:25 |只看该作者
谢谢   受教了:wink:

论坛徽章:
0
8 [报告]
发表于 2008-09-24 22:21 |只看该作者
原帖由 5毛党党员 于 2008-9-24 14:10 发表
int flags = fcntl(clifd, F_GETFL, 0);
        fcntl(clifd, F_SETFL, flags & (!O_NONBLOCK));

我猜想的


这样所有的标志位都清掉了吧。
应该是flags & ~O_NONBLOCK ?

论坛徽章:
0
9 [报告]
发表于 2008-09-24 23:09 |只看该作者
ls是对的
APUE2
P65

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
10 [报告]
发表于 2008-09-24 23:28 |只看该作者
原帖由 cugb_cat 于 2008-9-24 14:13 发表
先GET,把标志记下来,再SET回去就行了。。

支持这个
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP