Linux系统文件描述符理解

1、查看系统文件描述符个数。

以下是查看Linux文件描述符的三种方式:

[root@localhost ~]# sysctl -a | grep -i file-max --color

fs.file-max = 392036

[root@localhost ~]# cat /proc/sys/fs/file-max

392036

[root@localhost ~]# ulimit -n

1024

      系统级限制:sysctl命令和proc文件系统中查看到的数值是一样的,这属于系统级限制,它是限制所有用户打开文件描述符的总和

      用户级限制:ulimit命令看到的是用户级的最大文件描述符限制,也就是说每一个用户登录后执行的程序占用文件描述符的总数不能超过这个限制

2、文件描述符和打开文件如何对应起来呢?

      对于每一个打开的文件描述符,都有一个文件的句柄,这个句柄存放的打开文件的各种属性,属性如下:

  • 1、当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)
  • 2、打开文件时所使用的状态标识(即,open()的flags参数)
  • 3、文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)
  • 4、对该文件i-node对象的引用
  • 5、文件类型
  • 6、文件其他的各种属性

      文件描述符合这个文件句柄对应起来,通过这个文件描述符可以访问打开的文件。

3、系统默认已经打开的文件的描述符。
STDIN_FILENO 0 标准输入
STDOUT_FILENO 1 标准输出
STDERR_FILENO 2 标准错误输出

4、dup和dup2的使用方法

#include<unistd.h>
int dup(int fd);
int dup2(int fd1,int fd2);

两个均为复制一个现存的文件的描述
两个函数的返回:若成功为新的文件描述,若出错为-1;
由dup返回的新文件描述符一定是当前可用文件描述中的最小数值。用dup2则可以用fd2参数指定新的描述符数值。如果fd2已经打开,则先关闭。若fd1=fd2,则dup2返回fd2,而不关闭它。通常使用这两个系统调用来重定向一个打开的文件描述符。

下面示例说明了dup和dup2的用法:

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main()
{
    int nFd1 = 0;
    int nFd2 = 0;
    int nSaveFd = 0;

    /** 保存重定向输出符 */
    nSaveFd = dup(STDOUT_FILENO);
    if(STDOUT_FILENO < 0)
    {
        perror("save STDOUT_FILENO failed : ");
        return 1;
    }
    /** 打开文件 */
    nFd1 = open("file.txt",O_RDWR);
    if(-1 == nFd1)
    {
        perror("open file.txt failed : ");
        return 1;
    }
    /** 把输出重定向到文件中去 */
    nFd2 = dup2(nFd1,STDOUT_FILENO);
    if(nFd2 < 0)
    {
        perror("dup2 failed: ");
        return 1;
    }
    /** 写入到打开的文件 */
    lseek(nFd1,0,SEEK_END);
    write(STDOUT_FILENO,"hell0\n",7);

    /** 恢复重定向输出,重定向输出到标准输出 */
    if(dup2(nSaveFd,nFd2) < 0)      
    {
        perror("back  STDOUT_FILENO failed: ");
        return 1;
    }
    write(STDOUT_FILENO,"dddd\n",7);
    close(nFd1);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmfrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值