linux高效能伺服器程式設計---第六章高階IO函式 (1)
阿新 • • 發佈:2022-05-06
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_FILENO
dup最小的即為STDOUT_FILENO
所以 標準輸出都到了這個檔案之中
int main() { int filefd = open("/home/lsmg/1.txt", O_WRONLY); close(STDOUT_FILENO); dup(filefd); printf("123\n"); exit(0); }