[英]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上的人們大多數時候都堅持編寫正確的代碼,因此要包含正確的標頭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.