Взаимодействие процессов, программные программы, функция 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д