Linux C编程学习笔记(4):dup,dup2,fcntl系统调用
来源:互联网 发布:关于linux 的书籍 编辑:程序博客网 时间:2024/05/19 00:47
fcntl_access.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>//自定义错误处理函数int my_err(const char *err_string,int line){ fprintf(stderr,"line:%d ",line); perror(err_string); exit(1); return 0;}int main(){ int ret; int access_mode; int fd; if((fd=open("example_3.c",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1) { my_err("open",__LINE__); } //设置文件打开方式 if((ret=fcntl(fd,F_SETFL,O_APPEND))<0) { my_err("fcntl",__LINE__); } //获取文件打开方式 if((ret=fcntl(fd,F_GETFL,0))<0) { my_err("fcntl",__LINE__); } access_mode=ret&O_ACCMODE; //O_ACCMODE取得文件打开方式的掩码,值为3。做与运算是为了取得ret的最后两位的值 if(access_mode==O_RDONLY) { printf("example_3 access mode:read only"); } else if(access_mode==O_WRONLY) { printf("example_3 access mode:write only"); } else if(access_mode==O_RDWR) { printf("example_3 access mode:read*write"); } if(ret&O_APPEND) { printf(",append"); } if(ret&O_NONBLOCK) { printf(",nonblock"); } if(ret&O_SYNC) { printf(",sync"); } printf("\n"); return 0;}
dup、dup2函数:
1.原型:
#include<unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd);
2.功能:
利用函数dup,我们可以复制一个文件描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这就意味着,这两个描述符共享所有的锁定、读写指针和各项权限或标志位。例如,如果我们对一个文件描述符执行lseek操作,另一个文件描述符的读写位置也会随着改变。
dup2与dup的区别就是dup2返回的文件描述符可以通过第二个参数“可用的文件描述符”指定。若newfd已经被程序使用,系统就会将其关闭以释放该文件描述符;若oldfd与newfd相等,则dup2返回newfd,而不关闭它。dup2调用成功,返回新的描述符,出错返回-1。
通过dup或dup2函数对标准输入和标准输出的操作来实现Shell中的重定向功能(喵喵喵~T.T不是很懂。。。)
fcntl函数:
1.原型:
#include<unistd.h> #include<fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock);
2.功能:
用来对已打开的文件描述符进行各种控制操作以改变已打开文件的各种属性。fcntl的功能依据cmd值的不同而不同。
3.参数:
fcntl的功能依据cmd值的不同而不同。
① F_DUPFD:fcntl功能与dup一样,复制由fd指向的文件描述符。
② F_GETFD:获取文件描述符的close-on-exec标志。
③ F_SETFD:设置文件描述符的close-on-exec标志为第三个参数arg的最后一位。
④ F_GETFL:获得文件打开的方式。
⑤ F_SETFL:设置文件打开的方式为arg指定的方式。(O_APPEND/O_NONBLOCK/O_AYNC)
阅读全文
0 0
- Linux C编程学习笔记(4):dup,dup2,fcntl系统调用
- dup,dup2,fcntl,ioctl,系统调用
- linux学习笔记(5):dup,dup2,fcntl
- Linux学习笔记:shell重定向功能中dup/dup2系统调用的作用
- linux系统编程-学习笔记3-dup/dup2/stat/lstat/fstat
- dup/dup2系统调用
- Linux系统调用dup()和dup2()
- dup、dup2、fcntl
- dup , dup2 , fcntl锁
- UNIX环境高级编程学习笔记(四)不调用fcntl函数实现dup2的功能
- Linux下面dup/dup2两个函数的学习笔记
- unix/linux中的dup()系统调用 --对上篇dup() dup2()例子的解释
- Linux 系统库函数 -- dup 和 dup2
- 【APUE学习笔记】dup和dup2用法
- linux中dup()、dup2()的学习总结
- dup,dup2,fcntl,ioctl用法简述
- 文件描述符和dup dup2 fcntl
- Linux系统编程——文件描述符的复制:dup()和dup2()
- 洛谷Oj-数的划分-递推/搜索+剪枝
- 152. Maximum Product Subarray
- 数据库链接
- Windows核心编程第一章笔记
- 处理Excel的类库主要有两种JXL 和POI和介绍.
- Linux C编程学习笔记(4):dup,dup2,fcntl系统调用
- LeetCode | 38. Count and Say
- 23.10 Admin features
- 公钥和私钥的区别
- Android Studio上传GitHub
- html5+css媒体查询、多列+精灵雪碧图
- 215. Kth Largest Element in an Array
- 淘淘商城系列——添加商品同步到索引库以及消息机制测试
- SpringBoot学习笔记-集成其他组件框架记录