免费注册 查看新帖 |

Chinaunix

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

[C] 请教c开发高手,c open怎么封装呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-17 17:27 |只看该作者 |倒序浏览
大家知道linux/unix下有一个很常见的文件打开函数:open
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *path, int oflag, ...  );

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

有一个疑问,如果我想对open函数做一些简单封装怎么做呢?
int xxx_open(const char *filename, int flag, ...)
{
  int           fd;
  mode_t        pmode;

  /* BUG for call open(fn, O_CREAT|O_RDWR) */
  if (flag & O_CREAT)
  {
    va_list     ap;

    va_start(ap, flag);
    pmode = va_arg(ap, mode_t);
    va_end(ap);
  }
  else
  {
    pmode = 0644;
  }
  
  if ((fd = open(filename, flag, pmode)) < 0)
  {
    ....
    return (-1);
  }

  return (fd);
}
这个封装是有问题的。但我想了很长时间也不知道怎么修改。哎!困惑啊!

论坛徽章:
0
2 [报告]
发表于 2012-11-17 18:46 |只看该作者
封装的目的?

论坛徽章:
0
3 [报告]
发表于 2012-11-17 18:59 |只看该作者
想做一些基础的处理,错误处理,。。。。。就是做不了识别mode,哎。可变参数没办法得到可变参数个数。


open(filename, O_CREAT|O_RDWR)
open(fiilename, O_CREAT|O_RDWR, 0644)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2012-11-17 19:10 |只看该作者
回复 1# g_hk


    用python  早封装好了

论坛徽章:
0
5 [报告]
发表于 2012-11-17 19:57 |只看该作者
只能c,要是可以多态就好了。

论坛徽章:
0
6 [报告]
发表于 2012-11-17 21:34 |只看该作者
g_hk 发表于 2012-11-17 18:59
想做一些基础的处理,错误处理,。。。。。就是做不了识别mode,哎。可变参数没办法得到可变参数个数。

...

用指针来做参数列表吧,最后一个参数为空指针。缺点是调用的时候比较麻烦。说实话我也没见过更好的办法。
int my_open(char* path, int flags, ...)
{
  va_list(vl);
  va_start(vl, flags);
  void* arg = va_arg(vl, void*);
  while(NULL != arg)
  {
      //processing arguments here
  }
  va_end(vl);
}

论坛徽章:
0
7 [报告]
发表于 2012-11-18 10:23 |只看该作者
回复 6# qinggeng
嗯, 使用很不方便。最好和原来的open一样使用,就函数名字变了。还可以用于函数指针调用。


   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2012-11-18 11:38 |只看该作者
本帖最后由 linux_c_py_php 于 2012-11-18 11:39 编辑

怎么就识别不了了? open又不是变出来的,都是人写的, 你不是也写了吗?

open是根据第二个参数是否包含O_CREAT以及文件是否已存在决定是否使用第三个参数的, 如果用户传了O_CREAT但没传第三个参数, core了活该。

论坛徽章:
0
9 [报告]
发表于 2012-11-20 22:35 |只看该作者
回复 8# linux_c_py_php

open("/a/abc.txt", O_CREAT|O_RDWR)
这样是没有问题的。不会core的。

但我们封装不行啊,不知道mode是什么。这才是主要问题所在。


   

论坛徽章:
0
10 [报告]
发表于 2012-11-21 16:46 |只看该作者
觉得封装不行就先实现功能,等项目复杂了,你自然就会要封装,也知道封装要达到的目地。
注意,程序最终就是那一坨硬件执行的二进制码,任何不会实质改变这坨二进制码的修改,我是全部忽视。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP