2015-11-15 4 views
0

Я хотел бы знать, каковы различия между заголовками unistd.h и stdlib.h, когда речь идет о создании дочерних процессов и установлении связей через каналы ...Unistd.h или stdlib.h при создании дочерних процессов в Linux

функции системного вызова, которые мы используем в этих случаях, read(), write(), wait(), pipe(), fork(), exit(). И кажется, что библиотека stdlib.h тоже их, почему все примеры здесь в stackoverflow или другие сайты включают оба заголовка ?.

Демонстрация:

Откройте консоль и написать нано program.c, вставьте следующий код. Theng скомпилировать его с gcc program.c -o program и вы получите ИДП:

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

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

Первое, что нужно знать, это то, что они не БИБЛИОТЕКИ! И ты уверен? AFAIK 'read()', 'write()' ... и т. Д., Объявляются только в * uinstd.h *, 'exit()', хотя объявлено в * stdlib.h *. –

+0

Да, полностью уверен !, у меня есть программа, которая создает 10 дочерних процессов, которые получают сообщение от отца, и я включаю только и , все работает, труба, вилка, функции закрытия. Я не получаю ошибки. У меня есть ubuntu, и я редактирую скрипты с KWRITE. –

+0

Вы проверяли содержимое файлов? –

ответ

2

Функция 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 настаивают на написании правильного кода большую часть времени, следовательно, включение правильных заголовков.

1

Поскольку эти функции объявлены в различных файлах.

E.g. exit() объявлен в stdlib.h, pipe() объявлен в unistd.h

Смежные вопросы