linux基礎-檔案描述符
阿新 • • 發佈:2019-01-23
檔案描述符簡介
- 檔案描述符(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;
}