系统编程入门
?一、什么是系統(tǒng)編程?
系統(tǒng)編程就是利用系統(tǒng)調(diào)用system call進行編程
?
二、系統(tǒng)編程特點?
1.無法跨平臺(OS)
2.速度慢,用戶空間到內(nèi)核空間的切換需要時間
3.更加底層,接口更復雜
三、Linux編程
1.標準庫函數(shù)與系統(tǒng)調(diào)用
①fopen(3)
fopen(2)打開指定的文件,返回一個文件描述符(就是一個int類型的編號 ),分配一個FILE結構體,其中包含該文件的描述符,I/O緩沖區(qū)和當前讀寫位置等信息,返回這個FILE結構體的地址。
②fgetc(3)
通過傳入的FILE *參數(shù)找到該文件的描述符、I/O緩沖區(qū)和當前的讀寫位置,判斷能否從I/O緩沖區(qū)中讀到下一個字符,如果能讀到就直接返回該字符,否則調(diào)用read(2),把文件描述符傳進去,讓內(nèi)核讀取該文件的數(shù)據(jù)到I/O緩沖區(qū),然后返回下一個字符。
③fputc(3)
判斷該文件的I/O緩沖區(qū)是否有空間再存放一個字符,如果有空間則直接保存在I/O緩沖區(qū)中并返回,如果I/O緩沖區(qū)已滿就調(diào)用write(2),讓內(nèi)核把I/O緩沖區(qū)的內(nèi)容寫回文件。
#include <stdio.h>int main(void) {int i;for (int i = 0; i < 1025; i++) {fputc('A', stdout);}return 0; }④fclose(4)
如果I/O緩沖區(qū)中還有數(shù)據(jù)沒寫回文件,就調(diào)用write(2)寫回文件,然后調(diào)用close(2)關閉文件,釋放FILE結構體和I/O緩沖區(qū)。
2.標準庫函數(shù)與系統(tǒng)調(diào)用
每個進程在Linux內(nèi)核中都有一個task_struct結構體來維護進程相關的信息,稱為進程控制塊(PCB,Process Control Block)。
taks_struct中有一個指針指向files_struct結構體,稱為文件描述符表,其中每個表項包含一個指向已打開的文件的指針,用戶程序不能直接訪問內(nèi)核中的文件的描述符表,而只能使用文件描述符表的索引,這些索引就稱為文件的描述符,用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系统中打开微信浏览器
- 下一篇: java信息管理系统总结_java实现科