1. 程式人生 > >linux基礎-檔案描述符

linux基礎-檔案描述符

檔案描述符簡介

  • 檔案描述符(file descriptor)通常是一個小的非負整數,核心用以標識一個特定程序正在訪問的檔案。當開啟一個現有檔案或建立一個新檔案時,核心向程序返回一個檔案描述符。
  • 每個程序在PCB(Process Control Block)中儲存著一份檔案描述符表,檔案描述符就是這個表的索引,每個表項都有一個指向已開啟檔案的指標。
    在這裡插入圖片描述

標準輸入輸出

  • 檔案描述符 0 與 程序的標準輸入(standard input)關聯
  • 檔案描述符 1 與 標準輸出(standard output)關聯,
  • 檔案描述符 2 與 標準錯誤(standard error)關聯。

在/usr/include/unistd.h

#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */


檔案描述符數最大值

  • 檢視命令 ulimit -n :linux為通常1024
  • 臨時增大檔案描述符數命令 ulimit -HSn 65536
  • 永久更改檔案描述符最大數:在 /etc/security/limits.conf 檔案最後加入如下兩行:
    * soft nofile 65536
    * hard nofile 65536

複製檔案描述符 dup2函式

在這裡插入圖片描述

如果有標準輸出,則都輸出到檔案2中了
例項:將ps -aux 命令執行的結果輸出到檔案中

 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
 int main(void)
 {
 

                char* pathname="./processes.txt";
                int
fd = open(pathname,O_CREAT|O_RDWR|O_TRUNC,0664); //建立一個存放 程序資料的檔案 dup2(fd,1); //將開啟的檔案描述符 複製到 stdout close(fd); //將原來的關閉 execlp("ps","ps","aux",NULL); printf("exec dead"); //如果出錯才會執行,否則不會執行下面語句 exit(1); return 0; }