Я использую ветвление функций (), должностное лицо ()...
Но как эта программа может быть скомпилирована без включения некоторых дополнительных заголовков (как sys/types.h, sys/wait.h).
Я использую человечность 10.04 с gcc версией 4.4.3
#include <stdio.h>
#include <stdlib.h>
int main()
{
pid_t pid;
printf("before fork\n");
pid = fork();
if(pid == 0)
{
/*child*/
if(execvp("./cpuid", NULL))
{
printf("error\n");
exit(0);
}
}
else
{
if(wait(NULL) != -1)
{
printf("ok\n");
}
}
return 0;
}
В классическом "ANSI" C, если вы вызываете функцию без ее объявления, компилятор ведет себя так, как если бы функция была неявно объявлена, чтобы принимать фиксированное, но не указанное количество аргументов и возвращать int
. Таким образом, ваш код действует так, как если бы fork ()
и execvp ()
были объявлены следующим образом:
int fork();
int execvp();
Поскольку execvp ()
принимает фиксированное количество аргументов и возвращает int
, это объявление совместимо. fork ()
также принимает фиксированное количество аргументов, но возвращает pid_t
; однако, поскольку pid_t
и int
являются эквивалентными типами на большинстве архитектур Linux, это объявление также эффективно совместимо.
Фактические определения этих функций находятся в стандартной библиотеке C, которая связана по умолчанию, поэтому определение доступно во время компоновки и, таким образом, код работает.
Как отмечает Кейт Томпсон, эта языковая функция была исключена в версии C99 стандарта языка C, и компиляторы, вызываемые в режиме C99 или C11, должны, по крайней мере, выдавать предупреждение, когда функция вызывается без явного объявления.
exec и fork объявлены в unistd.h, который, скорее всего, включен в один, если stdio.h или stdlib.h, которые вы явно указали в своем коде. "wait" взято из sys / wait.h ... Попробуйте вызвать gcc с помощью -c -E , чтобы сгенерировать предварительно обработанный вывод и посмотреть, откуда берутся объявления функций.