Взаимодействие процессов, программные программы, функция 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;
        }
    }
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы: stdio.h, unistd.h, signal.h
  2. Объявлена функция main()
  3. Создается массив из двух файловых дескрипторов типа int: fds[2]
  4. Создается процесс-потомок с помощью функции fork()
  5. Если fork() вернул -1, то выводится сообщение об ошибке и возвращается 1
  6. Если fork() вернул 0, то выполняется код в дочернем процессе
  7. В дочернем процессе открывается файл, на чтение, с помощью функции fdopen(), и проверяется его корректное открытие, иначе выводится сообщение об ошибке и возвращается 1
  8. В дочернем процессе читается содержимое файла с помощью цикла while и функции fgets(), и выводится на экран с помощью функции printf()
  9. В дочернем процессе закрывается файл с помощью функции fclose()
  10. Если fork() вернул число больше 1, то выполняется код в родительском процессе
  11. В родительском процессе создается массив из пяти строк: words[]
  12. В родительском процессе открывается файл, на запись, с помощью функции fdopen(), и проверяется его корректное открытие, иначе выводится сообщение об ошибке и возвращается 1
  13. В родительском процессе записываются строки из массива words в файл с помощью цикла for и функции fprintf()
  14. В родительском процессе закрывается файл с помощью функции fclose()
  15. В родительском процессе выполняется команда sleep(1), чтобы задержать выполнение программы на 1 секунду
  16. В родительском процессе отправляется сигнал SIGHUP дочернему процессу с помощью функции kill()
  17. В родительском процессе возвращается 0
  18. Если fork() вернул 0, то выполняется код в дочернем процессе
  19. В дочернем процессе возвращается 0
  20. Если fork() вернул число меньше или равное 1, то выполняется код в родительском процессе
  21. В родительском процессе возвращается 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы