1. 程式人生 > >2014025674(16) 《嵌入式系統程序設計》第五周學習總結

2014025674(16) 《嵌入式系統程序設計》第五周學習總結

阻塞 成功 fread kernel 版本 use 緩沖區 con ons

一、標準I/O的編程

fread與fwrite

1.fread是一個函數,是計算機程序中從一個文件流中讀數據,最多讀取count個元素,每個元素size字節,如果調用成功返回實際讀取到的元素個數,如果不成功返回 0。

函數原型為:

size_t fread( void * buffer , size_t size , size_t count , FILE * stream );

2.fwrite是一個C語言函數,向文件寫入一個數據塊。函數寫入文件(可安全用於二進制文件)。把 string 的內容寫入文件指針 file 處。 如果指定了 length,當寫入了 length 個字節或者寫完了string 以後,寫入就會停止,視乎先碰到哪種情況。fwrite()返回寫入的字符數,出現錯誤時則返回 false。

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

3.功能與參數

  • fread功能: 從一個文件流中讀數據,讀取 count個元素 ,每個元素 size字節.如果調用成功返回 值大於count。如不成功,返回實際讀取的元素個數,小於count.

  • 參數buffer: fresd中用於接收數據的內存地址,大小至少是 size* count字節. size:單個元素的大小,單位是字節 count:元素的個數,每個元素是size字節. stream:輸入流 返回值:實際讀取的元素個數.如果返回值與 count不相同,則可能文件結尾或發生錯誤;fwrite中是一個指針,對fwrite來說,是要獲取數據的地址; size:要寫入內容的單字節數; count:要進行寫入size字節的數據項的個數; stream:目標文件指針; 返回值:返回實際寫入的數據項個數count。

二、linux下進程相關的基本系統調用

1.函數

  • 函數的理解

      fork()函數用於從已存在的進程中創建一個新進程,新進程稱為子進程,而原進程稱為父進程。

       使用fork()函數得到的子進程是父進程的一個復制品,從父進程處繼承了整個進程的地址空間,而子進程所獨有的只有它的進程號、資源使用和計時器等,使用fork()函數,執行速度不是很快。

  • 函數語法

所需頭文件

#include<sys/types.h> // 提供類型 pid_t的定義
#include<unistd.h>
  • 函數原型

pid_t fork(void
)
  • 函數返回值

0:子進程

子進程ID(大於0的整數):父進程

-1:出錯

  • 函數使用註意點:fork()函數使用一次就創建一個進程,所以若把fork()函數放在了if else判斷語句中則要小心,不能多次使用fork()函數

2. exec族函數

  • 作用:exec族函數可以根據指定的文件名或目錄名找到可執行文件,並用它來取代原調用進程的數據段、代碼段和堆棧段,在執行完之後,原調用進程的內容除了進程號外全被新的進程替換了。
  • 在 Linux 中使用exec函數族主要有兩種情況。當進程認為自己不能再為系統和用戶做出任何貢獻時,可以調用exec函數族讓自己重生。 如果一個進程想執行另一個程序,可以調用 fork()函數新建一個進程,然後調用exec函數族中的任意一個函數。

3. exit()、_exit()

  • 作用:exit()和_exit()函數都是用來終止進程的。當程序執行到 exit()或_exit()時,進程會無條件地停止剩下的所有操作,清除包括PCB在內的各種數據結構,並終止本進程的運行。
  • 區別:

_exit()函數直接調用exit系統使進程停止運行, 清除其使用的內存空間,並清除其在內核中的各種數據結構;

exit()函數則在調用exit系統之前做了調用退出處理函數、清理 I/O 緩沖等保障了緩沖區內的數據不會直接丟失。

4. wait()、waitpid()

  • 作用:

wait()用於使當前進程阻塞,直到一個子進程結束或者當前進程接到了一個指定的信號為止。如果該父進程沒有子進程或者他的子進程已經結束,則wait()就會立即返回。

     waitpid()的作用和wait()一樣,但它並不一定要等待第一個終止的子進程,它還有若幹選項。實際上 wait()函數只是 waitpid()函數的一個特例,在 Linux 內部實現 wait()函數時直接調用的就是 waitpid()函數。

三、線程進程與程序

  • 線程(英語:thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內核線程(kernel thread),而把用戶線程(user thread)稱為線程。

  • 進程(英語:process),是計算機中已運行程序的實體。進程為曾經是分時系統的基本運作單位。在面向進程設計的系統(如早期的UNIX,Linux 2.4及更早的版本)中,進程是程序的基本執行實體;在面向線程設計的系統(如當代多數操作系統、Linux 2.6及更新的版本)中,進程本身不是基本運行單位,而是線程的容器。

  • 計算機程序(Computer Program)是指一組指示計算機或其他具有消息處理能力裝置每一步動作的指令,通常用某種程序設計語言編寫,運行於某種目標體系結構上。

2014025674(16) 《嵌入式系統程序設計》第五周學習總結