设为首页 收藏本站
查看: 1596|回复: 0

[经验分享] linux系统编程之文件与IO:文件描述符、open,close

[复制链接]

尚未签到

发表于 2019-1-28 07:43:08 | 显示全部楼层 |阅读模式
       
  • 什么是IO?
  
       
  • 输入/输出是主存和外部设备之间拷贝数据的过程
  设备->内存(输入操作)
  内存->设备(输出操作)
       
  • 高级I/O
  ANSI C提供的标准I/O库称为高级I/O,通常也称为带缓冲的I/O
       
  • 低级I/O
  通常也称为不带缓冲的I/O
  2. 文件描述符:fd
       
  • 对于Linux而言,所有对设备或文件的操作都是通过文件描述符进行的。   
  • 当打开或者创建一个文件的时候,内核向进程返回一个文件描述符(非负整数)。后续对文件的操作只需通过该文件描述符,内核记录有关这个打开文件的信息。   
  • 一个进程启动时,默认打开了3个文件,标准输入、标准输出、标准错误,对应文件描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),这些常量定义在unistd.h头文件中。C库函数中与之对应的是:stdin,stdout,stderr,不过这三个是FILE指针类型。
  3.文件描述符与文件指针相互转换
  可以通过以下两个函数实现:
       
  • fileno:将文件指针转换为文件描述符
  #include
  int fileno(FILE *stream)
  测试程序:
#include
#include

int main(void)
{
printf(
"fileno(stdin) = %d\n", fileno(stdin));
printf(
"fileno(stdout) = %d\n", fileno(stdout));
printf(
"fileno(stderr) = %d\n", fileno(stderr));
return 0;
}

测试结果:


  • fdopen:将文件描述符转换为文件指针
  #include

  FILE *fdopen(int fd, const char *mode)    //mode :r,w,r+,w+,a,a+
  4.文件系统调用

  • open系统调用
  有几种方法可以获得允许访问文件的文件描述符。最常用的是使用open()(打开)系统调用
  函数原型
  #include  
#include  
#include
  int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  参数
  path :文件的名称,可以包含(绝对和相对)路径
  flags:文件打开模式
  mode:用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限
  返回值
  打开成功,返回文件描述符;
  打开失败,返回-1
  文件打开方式:

  O_EXCL表示:当O_EXCL|O_CREAT时,若文件存在,则打开失败,不存在,则打开成功
  访问权限:

  open系统调用的几点说明:
  可以利用按位逻辑加(bitwise-OR)(|)对打开方式的标志值进行组合。
  如打开一个新文件:
  #define NEWFILE  (O_WRONLY|O_CREAT|O_TRUNC)
  对访问权限位进行访问所用到的标识符,均可以通过
  #include  访问到,同样可以通过|运算来对访问权限进行组合也可以直接给出数字表示如0655
  #define MODE755 (S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
  注:文件的访问权限是根据:umask&~mode得出来的,例如umask=0022,mode = 0655 则访问权限为:644
  测试程序:

#include
#include

#include

#include

#include

#include

#include

#include


#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}
while(0)
int main(void)
{
umask(
0);
int fd;
fd
= open("test.txt", O_WRONLY | O_CREAT, 0666);
if (fd == -1)
ERR_EXIT(
"open error");
printf(
"open succ\n");
return 0;
}


  测试结果一:采用默认的umask值

  测试结果二:重新设置umask值





    • close系统调用

  为了重新利用文件描述符,用close()系统调用释放打开的文件描述符
  函数原型:
  #include
  int close(int fd);
  函数参数:
  -fd :要关闭的文件的文件描述符
  返回值
  如果出现错误,返回-1
  调用成功返回0
  注:若没有显示调用close(),当程序退出时也会关闭文件


    • creat系统调用

  为了维持与早期的UNIX系统的向后兼容性,Linux也提供可选的创建文件的系统调用,它称为creat()。现代的linux内核很少采用creat创建文件,因为open可以完成创建功能
  函数原型:
  int creat(const char *path, mode_t mode);
  参数
  path :文件的名称,可以包含(绝对和相对)路径
  mode: 用来规定对该文件的所有者,文件的用户组及系 统中其他用户的访问权限
  返回值
  打开成功,返回文件描述符;
  打开失败,返回-1
  在UNIX的早期版本中,open()系统调用仅仅存在两个参数的形式。如文件不存在,它就不能打开这些文件。文件的创建则由单独的系统调用creat()完成。在Linux及所有UNIX的近代版本中,creat()系统调用是多余的。
  creat()调用
  fd = creat(file, mode);
  完全等价于近代的open()调用
  fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, mode);




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668448-1-1.html 上篇帖子: 请尝试使用open、lseek等函数创建 一个含有空洞的文件 下篇帖子: solaris下出现:cannot open display:0.0的另外一种可能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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