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
int dup(int fd);
int dup2(int fd1,int fd2);

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

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

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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;
}

你可能感兴趣的:(Linux高级编程)