C语言 open&close

printl()函数底层调用的是write()函数
文件描述符

Linux中会将所有的设备都当做文件来处理,每个文件对应一个文件描述符(file descriptor).所有的I/O操作都会调用文件描述符.
比如文件描述符0对应的是标准输入,就是我们的键盘.
文件描述符1对应的是标准输出,就是我们的console.
可以使用exec命令来改变文件描述符对应的文件(设备)
exec 1 > test

查看系统级别最大打开文件数sysctl -a | grep fs.file-max 197185
查看用户级别最大打开文件数ulimit -n 1024
也就是说系统为了不让某个进程占用全部文件描述符,设置了用户级别限制,所以可以通过更改用户级别限制来优化服务器

临时修改文件描述符上限:ulimit -SHn 65535
永久修改可以配置/etc/security/limits.conf文件

系统为每一个进程维护了一个文件描述符表,表默认是0~1023
如果新打开一个文件描述符(包含socket),是从最小的文件描述符开始占用

open

man 2 open

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);
参数 描述
pathname
flags 必选项O_RDONLY-O_WRONLY-O_RDWR&可选项O_APPEND-O_CREAT-O_EXCL-O_NONBLOCK
mode 权限位(mode & ~umask)

返回值:
最小可用的文件描述符,失败返回-1,设置errnum

文件描述符总共有1024个(0stdin,1stdout,2stderr),可以关掉(0,1,2)文件描述符

close

关闭文件描述符

#include 
int close(int fd);

成功返回0,失败返回-1,设置errnum

例子:

int fd = open("./test.txt",O_RDONLY|OCREAT,0666)

参考文献:
https://www.cnblogs.com/alan666/p/8311890.html
https://www.cnblogs.com/ginvip/p/6350222.html

你可能感兴趣的:(Linux)