A Simple Shell

A Simple Shell

fork

  • fork()和vfork()這兩個系統功能都可以複製出和呼叫者﹙parent﹚完全相同的process﹙child﹚。

    • 但呼叫vfork()後的parent process會被暫停,直到被複製出來的child process執行了exec()或exit();

    • 而呼叫fork()後的parent process會和新產生的child process平﹙concurrent﹚執行。

  • copy-on-write 的技術,在child process尚未對資料段作寫入的動作之前,parent與child process共用資料段;

    • 當 child process 對資料段記憶體作出寫入的要求時,系統會配置一塊實體記憶體﹙一個page﹚給 child process,並將原本資料段中被要求寫入之 page 的內容複製到這塊新的page;

    • 接著系統會更改child process的page table,使要被寫入資料的虛擬位址可以對應到上述新配置的實體記憶體位址。

dup

#include <unistd.h>
int dup( int oldfd );
int dup2( int oldfd, int targetfd );

  • 利用 dup,我們可以複製一個 file descriptor。傳給該函數一個既有的 fd,它就會返回一個新的 fd,這個新的 fd 是傳給它的 fd 的拷貝

  • dup2 函數跟dup函數相似,但 dup2 函數允許使用者規定一個有效 fd 和目標fd。dup2函數成功返回時,目標 fd(dup2函數的第二個參數)將變成源描述符(dup2函數的第一個參數)的複製品

int oldfd;
oldfd = open(“app_log”, (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );

  • 在本例中,我們打開了一個新文件,稱為「app_log」,並收到一個文件,該描述符叫做fd1。我們調用dup2函數,參數為oldfd和1,這會導致用我們新打開的文件描述符替換掉由1代表的文件fd(即stdout,因為標準輸出文件的id為1)。

  • 任何寫到stdout的東西,現在都將改為寫入名為「app_log」的文件中。需要注意的是,dup2函數在複製了oldfd之後,會立即將其關閉,但不會關掉新近打開的文件描述符,因為文件描述符1現在也指向它。

設定環境變數
setenv() unsetenv() printenv()

wildcard expansion
wordexp() wordfree()

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *