Взаимодействие процессов, программные программы, функция pipe() - C (СИ)
Формулировка задачи:
Ребят, я в си новичек, с большой буквы Н, помогите написать программу, в которой родительский процесс записывает в канал строку, а дочерний процесс его читает.
Решение задачи: «Взаимодействие процессов, программные программы, функция pipe()»
textual
Листинг программы
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
int main(void) {
int fds[2];
pid_t p;
if ( pipe(fds) ) {
fprintf(stderr, "Can't create a pipe!\n");
return 1;
}
switch ( p = fork() ) {
case -1 :
fprintf(stderr, "Can't fork process!\n");
return 1;
case 0 : {
char buf[BUFSIZ];
FILE * reader = fdopen(fds[0], "r");
if ( ! reader ) {
fprintf(stderr, "Can't open pipe for read!\n");
return 1;
}
while ( fgets(buf, BUFSIZ, reader) )
printf("%s", buf);
return fclose(reader);
}
default : {
const char * words[] = { "any", "many", "money", "more", NULL }, ** pWord;
FILE * writer = fdopen(fds[1], "w");
if ( ! writer ) {
fprintf(stderr, "Can't open pipe for write!\n");
return 1;
}
for ( pWord = words; *pWord; ++pWord )
fprintf(writer, "%s\n", *pWord);
if ( fclose(writer) ) {
fprintf(stderr, "Can't close pipe!");
return 1;
}
sleep(1);
kill(p, SIGHUP);
return 0;
}
}
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, unistd.h, signal.h
- Объявлена функция main()
- Создается массив из двух файловых дескрипторов типа int: fds[2]
- Создается процесс-потомок с помощью функции fork()
- Если fork() вернул -1, то выводится сообщение об ошибке и возвращается 1
- Если fork() вернул 0, то выполняется код в дочернем процессе
- В дочернем процессе открывается файл, на чтение, с помощью функции fdopen(), и проверяется его корректное открытие, иначе выводится сообщение об ошибке и возвращается 1
- В дочернем процессе читается содержимое файла с помощью цикла while и функции fgets(), и выводится на экран с помощью функции printf()
- В дочернем процессе закрывается файл с помощью функции fclose()
- Если fork() вернул число больше 1, то выполняется код в родительском процессе
- В родительском процессе создается массив из пяти строк: words[]
- В родительском процессе открывается файл, на запись, с помощью функции fdopen(), и проверяется его корректное открытие, иначе выводится сообщение об ошибке и возвращается 1
- В родительском процессе записываются строки из массива words в файл с помощью цикла for и функции fprintf()
- В родительском процессе закрывается файл с помощью функции fclose()
- В родительском процессе выполняется команда sleep(1), чтобы задержать выполнение программы на 1 секунду
- В родительском процессе отправляется сигнал SIGHUP дочернему процессу с помощью функции kill()
- В родительском процессе возвращается 0
- Если fork() вернул 0, то выполняется код в дочернем процессе
- В дочернем процессе возвращается 0
- Если fork() вернул число меньше или равное 1, то выполняется код в родительском процессе
- В родительском процессе возвращается 0