1. 程式人生 > 其它 >linux高效能伺服器程式設計---第六章高階IO函式 (1)

linux高效能伺服器程式設計---第六章高階IO函式 (1)

Linux提供的高階IO函式, 自然是特定條件下能力更強, 不然要他幹啥, 特定條件自然限制了他的使用頻率 檔案描述符 檔案描述符在是一個非負整數。是一個索引值,指向核心為每一個程序所維護的該程序開啟檔案的記錄表。 STDOUT_FILENO(值為1)- 值為1的檔案描述符為標準輸出, 關閉STDOUT_FILENO後用dup即可返回最小可用值(目前為, 1) 這樣輸出就重定向到了呼叫dup的引數指向的檔案

建立檔案描述符 - pipe dup dup2 splice select

pipe函式 這個函式可用於建立一個管道, 實現程序間的通訊.

// 函式定義
// 引數檔案描述符陣列 fd[0] 讀出 fd[1]寫入 單向管道
// 成功返回0, 並將一對開啟的檔案描述符填入其引數指向的陣列 // 失敗返回-1 errno #include <unistd.h> int pipe(int fd[2]);
// 雙向管道
// 第一個引數為 協議PF_UNIX(書上是AF_UNIX)感覺這裡指明協議使用PF更好一些
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int fd[2]);

學習了後面的內容瞭解到了程序間通訊, 回來補上一個例子

int main()
{
    
int fds[2]; socketpair(PF_UNIX, SOCK_STREAM, 0, fds); int pid = fork(); if (pid == 0) { close(fds[0]); char a[] = "123"; send(fds[1], a, strlen(a), 0); } else if (pid > 0) { close(fds[1]); char b[20] {}; recv(fds[0], b, 20, 0); printf(
"%s", b); } }

dup和dup2函式 複製一個現有的檔案描述符

#include <unistd.h>
// 返回的檔案描述符總是取系統當前可用的最小整數值
int dup(int oldfd);
// 可以用newfd來制定新的檔案描述符, 如果newfd已經被開啟則先關閉
// 如果newfd==oldfd 則不關閉newfd直接返回
int dup2(int oldfd, int newfd);

dup函式建立一個新的檔案描述符, 新的檔案描述符和原有的file_descriptor共同指向相同的目標. 回來補上例子, 這個例子由於關掉了STDOUT_FILENOdup最小的即為STDOUT_FILENO所以 標準輸出都到了這個檔案之中

int main()
{
    int filefd = open("/home/lsmg/1.txt", O_WRONLY);
    close(STDOUT_FILENO);
    dup(filefd);
    printf("123\n");
    exit(0);
}