系统编程入门
?一、什么是系統編程?
系統編程就是利用系統調用system call進行編程
?
二、系統編程特點?
1.無法跨平臺(OS)
2.速度慢,用戶空間到內核空間的切換需要時間
3.更加底層,接口更復雜
三、Linux編程
1.標準庫函數與系統調用
①fopen(3)
fopen(2)打開指定的文件,返回一個文件描述符(就是一個int類型的編號 ),分配一個FILE結構體,其中包含該文件的描述符,I/O緩沖區和當前讀寫位置等信息,返回這個FILE結構體的地址。
②fgetc(3)
通過傳入的FILE *參數找到該文件的描述符、I/O緩沖區和當前的讀寫位置,判斷能否從I/O緩沖區中讀到下一個字符,如果能讀到就直接返回該字符,否則調用read(2),把文件描述符傳進去,讓內核讀取該文件的數據到I/O緩沖區,然后返回下一個字符。
③fputc(3)
判斷該文件的I/O緩沖區是否有空間再存放一個字符,如果有空間則直接保存在I/O緩沖區中并返回,如果I/O緩沖區已滿就調用write(2),讓內核把I/O緩沖區的內容寫回文件。
#include <stdio.h>int main(void) {int i;for (int i = 0; i < 1025; i++) {fputc('A', stdout);}return 0; }④fclose(4)
如果I/O緩沖區中還有數據沒寫回文件,就調用write(2)寫回文件,然后調用close(2)關閉文件,釋放FILE結構體和I/O緩沖區。
2.標準庫函數與系統調用
每個進程在Linux內核中都有一個task_struct結構體來維護進程相關的信息,稱為進程控制塊(PCB,Process Control Block)。
taks_struct中有一個指針指向files_struct結構體,稱為文件描述符表,其中每個表項包含一個指向已打開的文件的指針,用戶程序不能直接訪問內核中的文件的描述符表,而只能使用文件描述符表的索引,這些索引就稱為文件的描述符,用int型變量保存。
句柄思想。
程序啟動時會自動打開三個文件:
①標準輸入 ②標準輸出 ③標準錯誤輸出
在C標準庫中分開用FILE *指針stdin,stdout和stderr表示。
這三個文件的描述符分別是0,1,2,保存在相應的FILE結構體中。
頭文件unistd.h中有如果的宏定義來表示這個文件描述符:
#include <stdio.h> #include <unistd.h>int main(void) {printf("%d\n",STDIN_FILENO);printf("%d\n",STDOUT_FILENO);printf("%d\n",STDERR_FILENO);return 0; }總結
- 上一篇: 判断在ios系统中打开微信浏览器
- 下一篇: 支付宝 PEM routines:PEM