關於close on exec標誌

2021-05-23 17:57:02 字數 1115 閱讀 2839

每個檔案描述符都有乙個close-on-exec標誌。預設情況下,這個標誌最後一位被設定為 0。這個標誌符的具體作用在於當開闢其他程序呼叫exec()

族函式時,在呼叫exec函式之前為exec族函式釋放對應的檔案描述符。

我們來看一下具體的例項:

char *s="ooooooooooooooooooo";

pid = fork();

if(pid == 0)

execl("ass", "./ass", &fd, null);

wait(null);

write(fd,s,strlen(s));

close(fd);

return 0;

}ass 源**

int main(int argc, char *argv)

ps:那個test.txt提前已經建立 為空檔案~

fcntl(fd, f_setfd, 1) 此句將fd的close-on-exec 標誌設定為1,開啟此標誌。那麼當子程序呼叫execl函式

時,execl執行ass,ass是不能向fd內寫入的,因為在呼叫execl函式之前系統已經講子程序的此檔案描述符關閉了。(attention:這裡是子程序!)

但是如果將 fcntl(fd, f_setfd, 1)

改為fcntl(fd, f_setfd, 0)

或者直接將此句注釋掉,那麼,ass便可以向這個檔案描述符中任意添寫東西了~~

ps:如果將fcntl設定為開啟,即設定為1,那麼, 此檔案描述符依然是可以被主程序操作的。

下面將程式執行的結過給大家:

當執行此句fcntl(fd, f_setfd, 1)

fd = 3fork!

argc = 2 fd = 3

test.txt中的內容為:

ooooooooooooooooooo

當將fcntl(fd, f_setfd, 1)注釋掉或者將 1改為 0時

結果:

fd = 3fork!

argc = 2 fd = 3lost

test.txt中的內容為:

zzzzzzzzzzzzzzzzzzoooooooooooooooooooooo

標誌暫存器df 關於標誌暫存器的各個標誌

運算結果標誌位 1 進製標誌cf carry flag 進製標誌cf主要用來反映運算是否產生進製或借位。如果運算結果的最高位產生了乙個進製或借位,那麼,其值為1,否則其值為0。使用該標誌位的情況有 多字 位元組 數的加減運算,無符號數的大小比較運算,移位操作,字 位元組 之間移位,專門改變cf值的指...

關於中斷請求標誌位

今天才發現我用了這麼長時間的中斷服務函式,竟然不知道中斷請求標誌位到底具體是什麼意思 悲哀!一般就用了定時器中斷服務函式,沒關心中斷請求標誌位,今天才發現,原來定時器中斷請求標誌位就是定時器溢位標誌位,定時器溢位時自動跳到相應中斷向量處,當主機響應該定時器中斷時,該標誌位由硬體自動清零。所以,我雖然...

關於標誌暫存器的簡單總結

標誌暫存器的標誌位,是對資料邏輯運算的結果進行特殊標記。比如兩個數相加是否產生了資料外溢,相減結果是否為零等等。通過對運算結果的標記,來進行判斷下一步執行的語句,從而達到分支語句的作用 跳轉 等操作。因此對標誌暫存器的理解學習尤為重要。add subxor orand 注意 資料移動操作不能影響標誌...