首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言文件操作進階:文件描述符、select 多路複用、管道與進程間通信實戰

     編輯:關於C語言

格式化 I/O 函數族

函數用途
fprintf/fscanf文件流格式化讀寫
sprintf/sscanf字符串格式化讀寫
printf/scanf標准輸入輸出(等價 stdout/stdin)

基於文件描述符的底層 I/O

文件描述符 (fd) 為非負整數,0/1/2 分別對應 stdin/stdout/stderr。常用函數:

  • open/creat/close:打開/創建/關閉,返回 fd。
  • read/write:無緩衝塊讀寫,返回字節數,0 表 EOF,-1 表錯誤。
  • lseek:隨機定位。
  • fcntl/ioctl:屬性控制。
  • dup/dup2:復制 fd。
int fd = open("file.txt", O_RDWR | O_CREAT, 0644);
char buf[1024];
ssize_t n = read(fd, buf, sizeof(buf));
write(STDOUT_FILENO, buf, n); // 輸出到屏幕
close(fd);

文件狀態獲取:stat/fstat

struct stat st;
stat("file.txt", &st); // 通過路徑
fstat(fd, &st);        // 通過 fd
// st.st_mode, st.st_size, st.st_uid ...

select 多路 I/O 多路複用

fd_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
struct timeval tv = {1, 0}; // 1 秒超時
int ret = select(maxfd+1, &readset, NULL, NULL, &tv);
if (ret > 0 && FD_ISSET(fd, &readset)) { /* 可讀 */ }

fdopen:文件描述符轉 FILE*

用於管道、Socket 等無法用 fopen 打開的 fd:

FILE* fp = fdopen(fd, "r"); // 模式需與 fd 原模式一致

管道通信

無名管道

int fds[2];
pipe(fds); // fds[0] 讀, fds[1] 寫
if (fork() == 0) { close(fds[1]); read(fds[0], buf, ...); }
else { close(fds[0]); write(fds[1], "hello", 6); }

有名管道 (FIFO) + 多進程聊天室示例

服務端監聽固定 FIFO 接收客戶端 PID,建立雙向 FIFO 通道,用 select 輪詢所有客戶端讀端,轉發消息。客戶端啟動時創建專屬 FIFO,fork 子進程讀取,父進程寫入。完整代碼見原文(含服務端/客戶端雙向通信邏輯)。

popen:進程管道

FILE* fp = popen("cat /etc/profile", "r"); // 讀取命令輸出
FILE* fp = popen("wc -w", "w");            // 向命令寫入輸入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved