內核是如何處理系統調用 每個系統調用被賦予了一個系統調用號 在i386平臺上,執行一個系統調用是通過int 0X80指令完成的 eax存放系統的調用號 ebx,ecx,edx,esi,edi存儲系統調用的參數,對於超過5個參數的系統調用,用一個寄存器指向用戶空間存儲所有的系統調用的參數 錯誤的處理 ...
內核是如何處理系統調用
- 每個系統調用被賦予了一個系統調用號
- 在i386平臺上,執行一個系統調用是通過int 0X80指令完成的
- eax存放系統的調用號
- ebx,ecx,edx,esi,edi存儲系統調用的參數,對於超過5個參數的系統調用,用一個寄存器指向用戶空間存儲所有的系統調用的參數
錯誤的處理
-
在系統調用中錯誤通常通過函數返回值來表示,並且通過特殊變數errno 來描述。
-
errno 這個全家變數在<errno.h>的頭文件中聲明:
extern int errno
-
錯誤處理函數 , 可以通過man進行查看
- perror
- strerror 存在於 <string.h>頭文件中
perror函數和strerror 函數
1 /* ************************************************************************
2 > File Name: t0.c
3 > Author: sansuitaibai
4 > email: [email protected]
5 > Created Time: 2022年09月15日 19時16分21秒 CST
6 > Description:
7 ************************************************************************/
8 #include<unistd.h>
9 #include<string.h>
10 #include<stdio.h>
11 #include<errno.h>
12
13 int main(){
14
15 int ret = 0;
16 ret = close(10);
17 if(ret == -1){
18 perror("close with: ");
19
20 }
21 if(ret == -1){
22 fprintf(stderr, "closr whith : %s\n", strerror(errno));
23 }
24 printf("EINTR = %s \n", strerror(EINTR));
25 return 0;
26
27 }
28
- perror 函數直接將errno 這個全局變數進行輸出,不需要我們的轉換
- strerror函數直接將錯誤碼對應的的字元串轉換過來(需包含<string.h>)
結果:
errno這個全局變數裡面存放的就是對應錯誤碼,每個錯誤碼對應不同的信息。如下:
錯誤碼:
錯誤碼 | 含義 |
---|---|
E2BIG | 參數太長 |
EACCESS | 許可權不足 |
EAGAIN | 重試 |
EBADF | 錯誤的文件描述符 |
EBUYS | 設備或資源忙 |
ECHILD | 無子進程 |
EDOM | 數學參數不在函數域內 |
EEXIST | 文件已經存在 |
EFAULT | 地址錯誤 |
EFBIG | 文件太大 |
EINTR | 系統調用中斷 |
什麼是I/O
- 在輸入和輸出是主存和外部設備之間拷貝數據的過程
- 設備->記憶體(輸入操作)
- 記憶體-> 設備 (輸出操作)
- 高級I/O
- ANSI C提供的標準I/O庫稱為高級I/O,通常也稱為帶緩衝的I/O
- 低級I/O
- 通常也稱為不帶緩衝的I/O
文件描述符
-
對於Linux而言,所有的對設備或文件的操作都是通過文件描述符進行的。
-
當打開一個或者創建一個文件時候,內核向進程返回一個文件描述符(非負整數)。後續對文件的操作只需要通過該文件描述符,內核記錄有關這個打開文件的信息。
-
當一個進程啟動時,預設打開了3個文件,標準輸入,標準輸出,標準錯誤三個文件描述符。對應描述符
- 0(STDIN_FILENO) : 文件指針 stdin
- 1(STDOUT_FILENO) : 文件指針 stdout
- 2(STDERR_FILENO) : 文件指針 stderr
這些常量定義在<unistd.h>頭文件中。
文件描述符與文件指針的轉換
-
int fileno(FILE *stream);
將文件指針轉換為文件描述符。
-
FILE *fdopen(int fd, const char *mode);
將文件描述符轉換為文件指針。
例子:stdin stdout stderr文件指針
/* ************************************************************************
2 > File Name: t0.c
3 > Author: sansuitaibai
4 > email: [email protected]
5 > Created Time: 2022年09月15日 19時16分21秒 CST
6 > Description:
7 ************************************************************************/
8 #include<unistd.h>
9 #include<string.h>
10 #include<stdio.h>
11 #include<errno.h>
12
13 int main(){
14
15 printf("fileno(stdin) = %d \n", fileno(stdin));
16 printf("fileno(stdout) = %d \n", fileno(stdout));
17 printf("fileno(stderr) = %d \n", fileno(stderr));
18
19 return 0;
20 }
21
結果: