免费注册 查看新帖 |

Chinaunix

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

apue fcntl函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-12 16:09 |只看该作者 |倒序浏览
#include "apue.h"
#include <fcntl.h>
int set_f1(int fd,int flags){
  int val;
  if((val=fcntl(fd,F_GETFL,0))<0){
    printf("fcntl gettfl error\n");
    exit(-1);
  }
  val |=flags;
  if(fcntl(fd,F_SETFL,val)<0){
    printf("fcntl F_SETFL error\n");
    exit(-2);
  }
}
int main (int argc,char *argv[])
{
  int val;
  int val1;
  int fd;
  //  if(argc!=2){
  // printf("usage:a.out <descriptor>\n");
  // exit(-1);
  //}
  //fd=atoi(argv[1]);
  if((fd=open("tt",O_RDWR | O_APPEND,FILE_MODE))<0){
    printf("error creat\n");
    exit(-1);
  }
   printf("fd:%d\n",fd);
   set_f1(fd,O_SYNC);
  // printf("fd:%s",atoi(argv[1]));

  if((val=fcntl(fd,F_GETFL,0))<0){
    printf("fcntl error for fd %d\n",atoi(argv[1]));
    exit(-1);
  }
  switch (val & O_ACCMODE){
  case O_RDONLY:
    printf("read only");
    break;
  case O_WRONLY:
    printf("write only");
    break;
  case O_RDWR:
    printf("read write");
    break;
  default:
    {
      printf("unknow access mode");
      exit(-3);
    }
  }
    if(val & O_APPEND)
      printf(",append");
    if(val & O_NONBLOCK)
      printf(",nonblocking");
#if defined(O_SYNC)
    if(val & O_SYNC)
      printf(",synchronous writes");
#endif
#if !defined(_POSIX_C_SOURCE) && defined (O_FSYNC)
    if(val & O_FSYNC)
      printf(",synchronous writes ");
#endif
    putchar('\n');
    exit(0);
}
为什么输出是read write,append
而不是read write,append,synchronous writes
小弟实在 是不理解  望大家赐教   谢谢了

[ 本帖最后由 uid500 于 2008-9-12 16:12 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-12 16:30 |只看该作者
....................,有谁帮忙啊,谢谢了

论坛徽章:
0
3 [报告]
发表于 2008-09-12 17:14 |只看该作者
我在机子上也试了一下,出现同样的结果。是由于给set_f1()函数的参数是值传递,退出该函数后,fd 并没改变,还是原来的值。所以'synchrous write'才没显示出来。

论坛徽章:
0
4 [报告]
发表于 2008-09-12 17:23 |只看该作者
原帖由 disheng727 于 2008-9-12 17:14 发表
我在机子上也试了一下,出现同样的结果。是由于给set_f1()函数的参数是值传递,退出该函数后,fd 并没改变,还是原来的值。所以'synchrous write'才没显示出来。



不是吧,着两个函数放在同一个函数中也是一样的啊
fd 只不过是整数哦,无所谓的

论坛徽章:
0
5 [报告]
发表于 2008-09-12 17:37 |只看该作者
有没有高手帮忙解释一下啊,在网上查了很久,看了很多帖子,但是还是不理解啊 :wink:

论坛徽章:
0
6 [报告]
发表于 2008-09-12 17:40 |只看该作者
man手冊的意思是Linux上不能更改O_SYNC。

论坛徽章:
0
7 [报告]
发表于 2008-09-12 17:41 |只看该作者
On Linux this command can only  change  the  O_APPEND,  O_NONBLOCK,
              O_ASYNC, and O_DIRECT flags.

论坛徽章:
0
8 [报告]
发表于 2008-09-12 17:46 |只看该作者
BSD-derived systems and Linux always return an error

论坛徽章:
0
9 [报告]
发表于 2008-09-12 17:49 |只看该作者
原帖由 insmile 于 2008-9-12 17:46 发表
BSD-derived systems and Linux always return an error


。。。lz这个也没报错啊,奇怪

论坛徽章:
0
10 [报告]
发表于 2008-09-12 17:56 |只看该作者
原帖由 5毛党党员 于 2008-9-12 17:41 发表
On Linux this command can only  change  the  O_APPEND,  O_NONBLOCK,
              O_ASYNC, and O_DIRECT flags.


呵呵看见了,以后要多看看man 但是如果改成其他的行吗?还有二楼的讲法对吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP