文章目錄
- Linux | 系統調用
- `open` 系統調用
- 功能
- 頭文件和函數原型
- 參數解釋
- 返回值
- 示例代碼
- 其他常用系統調用
- `read` 系統調用
- `write` 系統調用
- `close` 系統調用
- `lseek` 系統調用
- `stat` 系統調用
Linux | 系統調用
前言:在Linux系統中,系統調用是用戶空間程序與內核進行交互的橋梁,用戶程序通過系統調用請求內核提供的服務。下面將詳細介紹
open
系統調用以及其他常用的系統調用。
以下是 Linux 中幾類核心系統調用:
類別 | 系統調用示例 | 功能描述 |
---|---|---|
文件操作 | open , read , write , close | 打開/讀/寫/關閉文件 |
進程控制 | fork , execve , waitpid , exit | 創建進程、加載程序、等待子進程退出 |
內存管理 | brk , mmap , munmap | 調整堆內存、內存映射 |
網絡通信 | socket , bind , connect , send | 創建套接字、綁定端口、連接遠程主機、發送數據 |
設備控制 | ioctl | 控制硬件設備(如調整終端參數) |
權限管理 | chmod , setuid | 修改文件權限、切換用戶身份 |
下面主要講解open系統調用和一些常用的系統調用
open
系統調用
功能
open
系統調用用于打開或創建一個文件、設備等,返回一個文件描述符(非負整數),后續對該文件的操作都可以通過這個文件描述符來進行。
頭文件和函數原型
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
參數解釋
pathname
:要打開或創建的文件的路徑名,可以是絕對路徑或相對路徑。flags
:用于指定文件的打開方式和行為,常用的標志有:O_RDONLY
:以只讀方式打開文件。O_WRONLY
:以只寫方式打開文件。O_RDWR
:以讀寫方式打開文件。O_CREAT
:如果文件不存在,則創建該文件。使用此標志時,需要第三個參數mode
來指定新文件的權限。O_TRUNC
:如果文件已經存在且以寫方式打開,則將文件長度截斷為0。O_APPEND
:以追加方式打開文件,每次寫操作都將數據追加到文件末尾。
mode
:當使用O_CREAT
標志創建新文件時,mode
參數指定新文件的權限。權限值通常使用八進制表示,例如0644
表示文件所有者有讀寫權限,其他用戶有讀權限。
返回值
- 成功時返回一個新的文件描述符(通常是當前可用的最小非負整數)。
- 失敗時返回 -1,并設置
errno
變量來指示具體的錯誤原因。
示例代碼
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>int main() {int fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("open");return 1;}printf("File opened successfully. File descriptor: %d\n", fd);close(fd);return 0;
}
其他常用系統調用
read
系統調用
- 功能:從文件描述符指定的文件中讀取數據到緩沖區。
- 頭文件和函數原型:
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
- 參數解釋:
fd
:要讀取數據的文件描述符。buf
:用于存儲讀取數據的緩沖區。count
:要讀取的最大字節數。
- 返回值:
- 成功時返回實際讀取的字節數,可能小于
count
。 - 到達文件末尾時返回 0。
- 失敗時返回 -1,并設置
errno
。
- 成功時返回實際讀取的字節數,可能小于
write
系統調用
- 功能:將緩沖區中的數據寫入到文件描述符指定的文件中。
- 頭文件和函數原型:
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);
- 參數解釋:
fd
:要寫入數據的文件描述符。buf
:包含要寫入數據的緩沖區。count
:要寫入的字節數。
- 返回值:
- 成功時返回實際寫入的字節數,可能小于
count
。 - 失敗時返回 -1,并設置
errno
。
- 成功時返回實際寫入的字節數,可能小于
close
系統調用
- 功能:關閉指定的文件描述符,釋放相關資源。
- 頭文件和函數原型:
#include <unistd.h>int close(int fd);
- 參數解釋:
fd
:要關閉的文件描述符。
- 返回值:
- 成功時返回 0。
- 失敗時返回 -1,并設置
errno
。
lseek
系統調用
- 功能:用于改變文件的當前讀寫位置。
- 頭文件和函數原型:
#include <sys/types.h>
#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
- 參數解釋:
fd
:要操作的文件描述符。offset
:偏移量,可正可負。whence
:指定偏移量的起始位置,常用的值有:SEEK_SET
:從文件開頭開始計算偏移量。SEEK_CUR
:從文件當前位置開始計算偏移量。SEEK_END
:從文件末尾開始計算偏移量。
- 返回值:
- 成功時返回新的文件偏移量。
- 失敗時返回 -1,并設置
errno
。
stat
系統調用
- 功能:獲取文件的狀態信息,如文件大小、權限、創建時間等。
- 頭文件和函數原型:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int stat(const char *pathname, struct stat *statbuf);
-
參數解釋:
pathname
:要獲取狀態信息的文件路徑名。statbuf
:指向struct stat
結構體的指針,用于存儲文件的狀態信息。
-
返回值:
- 成功時返回 0。
- 失敗時返回 -1,并設置
errno
。