簡體   English   中英

在Linux中創建子進程時的unistd.h或stdlib.h

[英]The unistd.h or stdlib.h when creating child processes in Linux

我想知道在創建子進程和通過管道建立通信時,標頭unistd.h和stdlib.h之間有什么區別...

在這些情況下,我們使用的系統調用函數為read()write()wait()pipe()fork()exit() 而且似乎stdlib.h庫也包含它們,為什么在stackoverflow或其他站點中的所有示例都包含兩個標頭?

示范:

打開控制台並編寫nano program.c ,粘貼以下代碼。 然后使用gcc program.c -o program編譯它,您將獲得pid:

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int pid;
   pid = fork();
   printf("EL pid %i\n", pid);
}

函數exit()在C標准中定義,其聲明指定為<stdlib.h>所屬。

open()read()fork()pipe()等是Posix系統調用,C標准未涵蓋。 Posix指定其中大多數應在<unistd.h>聲明(盡管open()來自<fcntl.h> )。

一些較舊的系統曾經用來混合或復制這些聲明,但是為了符合這些標准,現代環境不再使用。

請注意,原始的C標准允許編譯器猜測未知函數的原型。 C99和C11沒有。 您的示例代碼將使用適當的編譯器進行編譯,並產生正確的輸出,因為所使用的系統調用具有非常基本的API。 使用-Wall -Werror -std=c99編譯相同的代碼將無法生成可執行文件。

這種方式的編程被認為是草率的,不再受支持。 C有足夠的陷阱,因為它不再寬容這種樣式。 Stack Overflow上的人們大多數時候都堅持編寫正確的代碼,因此要包含正確的標頭。

因為這些函數是在不同的頭文件中聲明的。

例如exit()在stdlib.h中聲明, pipe()在unistd.h中聲明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM