| 函數 | 用途 |
|---|---|
fprintf/fscanf | 文件流格式化讀寫 |
sprintf/sscanf | 字符串格式化讀寫 |
printf/scanf | 標准輸入輸出(等價 stdout/stdin) |
文件描述符 (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);
struct stat st;
stat("file.txt", &st); // 通過路徑
fstat(fd, &st); // 通過 fd
// st.st_mode, st.st_size, st.st_uid ...
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)) { /* 可讀 */ }
用於管道、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 接收客戶端 PID,建立雙向 FIFO 通道,用 select 輪詢所有客戶端讀端,轉發消息。客戶端啟動時創建專屬 FIFO,fork 子進程讀取,父進程寫入。完整代碼見原文(含服務端/客戶端雙向通信邏輯)。
FILE* fp = popen("cat /etc/profile", "r"); // 讀取命令輸出
FILE* fp = popen("wc -w", "w"); // 向命令寫入輸入