系統程式設計 程序 當檔案操作遇上fork

2022-06-05 06:42:06 字數 3024 閱讀 6498

我的關聯博文:

test1:   lseek基本使用 

#include #include #include #include #include #include char string_buf = "hello";

char char_h = 'h';

int main()

**父子程序的檔案描述符、檔案表項、i節點,

以lseek+fork實驗為切入點進行分析。

實驗思路:

做兩個實驗,一是先fork,父程序先lseek後, 子程序才write,觀察子程序寫入該檔案的偏移在哪。

再乙個實驗是,先lseek,然後才fork。

test2

**父子程序的檔案描述符、檔案表項、i節點

以lseek+fork實驗為切入點進行分析

實驗思路:先fork,父程序先lseek後, 子程序才write,觀察子程序寫入該檔案的偏移在哪。

#include #include #include #include #include #include char string_buf = "hello";

char char_h = 'h';

int main()else if( pid > 0)else

close(fd);

return 0;

}

編譯執行:

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當

檔案操作遇上fork# gcc test.c

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當

檔案操作遇上fork# ./a.out

sizeof(string_buf) = 5

bytes_done = 5

offset = 15

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當

檔案操作遇上fork# add_1_byte = 1

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當

檔案操作遇上fork# hexdump -c -n 100 file.txt

00000000 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 48 |hello..........h|

00000010

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork#

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork#

實驗現象: 父程序在fork前開啟了檔案,父程序先執行lseek, 子程序延時1秒後才執行寫檔案,則會受父程序剛才的lseek操作影響。

小結: 檔案偏移量這一資訊記錄在核心的檔案表項中,父子程序有自己獨立的檔案描述符表,但是共享檔案表項和i節點。

本實驗父子程序實際上操作的是同乙個檔案表項,所以才產生了這種現象。

test3

**父子程序的檔案描述符、檔案表項、i節點

以lseek+fork實驗為切入點進行分析

實驗思路:先lseek,然後才fork...

#include #include #include #include #include #include char string_buf = "hello";

char char_h = 'h';

char char_l = 'l';

int main()else if( pid > 0)else

close(fd);

return 0;

}

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork# gcc test.c

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork# ./a.out

sizeof(string_buf) = 5

bytes_done = 5

offset = 15

add_1_byte = 1

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork# add_1_byte = 1

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork# hexdump -c -n 100 file.txt

00000000 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 4c |hello..........l|

00000010 48 |h|

00000011

root@lmw-virtual-machine:/home/lmw/mine/linux_c_exercise/fork/當檔案操作遇上fork#

檔案偏移量這一資訊記錄在核心的檔案表項中,父子程序有自己獨立的檔案描述符表,但是共享檔案表項和i節點。

本實驗父子程序實際上操作的是同乙個檔案表項,所以才產生了這種現象。

核心檔案結構:

本博文test2、test3中,父子程序操作同乙個檔案表項,如下圖所示

系統程式設計概述(程序)

程序概念 所有的裝置都是圍繞儲存器工作的 標準輸入裝置輸入指令,載入到記憶體中,然後記憶體交給cpu處理指令,將處理好的指令再交給記憶體,內存在交給標準輸出裝置。時載入到cpu的暫存器上處理 什麼是程序 說的通俗一點就是進行中的程式 作業系統通過pcb來控制程序的執行,這個pcb 一種程序描述符 也...

系統程式設計之程序

一 程序相關概述 1 相關指令 ps aux 檢視所有程序 ps aux grep 程序 只會過濾出指定程序資訊 top 指令類似windows任務管理器 2 程序描述符 pid pid 0 稱為交換程序 程序排程 pid 1 init程序 系統初始化 二 c程式的儲存空間是如何分配的 從高位址到低...

系統程式設計之檔案系統程式設計

系統呼叫 所有的作業系統都提供多種服務的入口點,程式由此向核心請求服務。這些可直接進入核心的入口點被稱為系統呼叫。不同作業系統提供了自己的一套系統呼叫,所以系統呼叫無法實現跨平台使用。而且頻繁地系統呼叫,在使用者態和核心態之間切換,很耗費資源,效率不高。c標準庫提供了操作檔案的標準i o函式庫,與系...