每天資訊淺析利用程序實現檔案控制

菜單

淺析利用程序實現檔案控制

前言

在《關於程序建立分析》一文中,對一些linux命令以及程序建立、程序狀態做了講解,還做了幾個小lab。在本篇文章中,將繼續延續上篇文章的知識,講解一些檔案操作指令並做一些小lab。

淺析利用程序實現檔案控制

解決殭屍問題

wait()函式是為了回收資源

wait for process to change state

1.父程序還在,並且主動回收子程序資源

pid_t wait (int *status)

status:獲取子程序的退出狀態

如果這裡是:wait(NULL),代表父程序只回收資源,不關心子程序退出狀態。

int x;

wait(&x)

返回值:

成功:返回結束的子程序pid號

失敗:-1

如果程序在執行態,那麼wait函式就會阻塞等待子程序變成殭屍態為止。

如果子程序在殭屍態,wait函式馬上返回。

例題:

子程序工作時間長,父程序工作時間短。

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

2.子程序工作時間短,父程序工作時間長

這種情況會出現殭屍程序問題。

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

可以看到這裡是有殭屍程式的。

3.父程序還在,不主動回收子程序資源

子程序等到父程序退出為止,在尋求一個新的父親作為父程序,幫自己回收資源。

淺析利用程序實現檔案控制

4. 子程序的退出狀態如何返回給父親

子程序在退出時,需要呼叫一個函式,就可以把退出狀態返回給父程序。

淺析利用程序實現檔案控制

這三個函式都可以使得程序退出,並且可以將退出狀態返回給父程序。

exit()先清洗緩衝區,再退出。

導致普通程序結束:

淺析利用程序實現檔案控制

引數:

status :0表示正常退出

非0表示異常退出

Exit(),exit() 不清洗緩衝區,直接退出

子程序退出狀態問題

例題:

父程序去回收子程序的資源,子程序正常退出,輸出 ok,異常退出,輸出err

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

程式中,呼叫exit()函式與執行return語句有什麼區別?

如果在main函式中,exit與return語句作用是一樣的。

如果不在main函式中,exit就代表程序的退出,return 語句只是代表函式的返回。

扇形程序個數問題

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

exec函式族

exec函式組介面

exec 執行

exec函式族,指的是一堆可以幫我們執行程式的函式

淺析利用程序實現檔案控制

path:需要執行的那個程式的絕對路徑

arg:以“,”分開所有引數,以NULL,作為結束標誌(直接作為形參)

file:程式的檔名

argv:以”,“分開所有引數,以NULL作為結束標誌(先放到一個數組中,再把陣列作為形參)

envp:環境變數的路徑

例題:讓子函式實現ls -l操作

淺析利用程序實現檔案控制

結論:

只要執行了exec函式族,那麼程序後面的程式碼會被覆蓋。

淺析利用程序實現檔案控制

可以看到並沒有printf出。

如何確保子程序先執行?

淺析利用程序實現檔案控制

fork是隨機執行,vfork是父程序阻塞。

當子程序中呼叫exit()函式後者是exec函式族中的介面時,就會開始執行父程序的程式碼。

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

父子程序之間的資源問題

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

程序之間的通訊:

程序之間的資源是分開的,程序之間的資源沒有辦法進行交換。

linux下,有多少通訊方式?

一共有4種:

管道通訊:無名管道與有名管道。是一種專門用於通訊的檔案,一個程序往管道檔案中寫入,一個程序從管道檔案中讀出資料。

訊號:透過傳送一些訊號給程序,那麼這個程序會轉換為相應的狀態。

訊息佇列:一個程序負責將訊息傳送到佇列上,另一個程序可以從訊息佇列中讀取資料出來。讀取訊息的程序可以讀取佇列上某一個特定的資料。

共享記憶體:兩個程序使用同一片記憶體空間進行資料交換。

什麼是無名管道?

無名管道實際是一個數組,所以只能運行於一個檔案中。

只能作用於親緣關係的程序,例如:父子程序。

實現步驟:

1。申請一個數組:讀端和寫段是一個檔案描述符,陣列應該定義為:int fd[2],現在只是定義了陣列。

2。使用函式介面來初始化陣列,使得陣列的元素變成讀端和寫端。

淺析利用程序實現檔案控制

返回值:

成功0

失敗-1

初始化成功

結果:

fd[0]——>讀端

fd[1]——>寫端

初始化的讀端與寫端檔案描述符等於多少?

pipefd:一個具有2個int型別變數的陣列。

例題:初始化的讀端與寫端的檔案描述符

淺析利用程序實現檔案控制

淺析利用程序實現檔案控制

總結

程序這部分內容,是有很多值得研究的東西,還有資源共享、互斥、同步、鎖等有關問題,使得使用者使用更加方便。