Совместное использование файловых дескрипторов между родителем и дочерним элементом после того, как дочерний элемент выполняет вызов exec (UNIX / C) - PullRequest
1 голос
/ 07 сентября 2011

У меня есть задание в моем классе ОС. Я должен написать три программы, одна программа читает из файла и записывает в канал, одна программа читает из канала и записывает в файл, а третья программа является родительской, которая создает канал и делает две вилки, чтобы порождает дочерние процессы, которые немедленно выполняют вызовы exec (). В настоящее время я использую канал, чтобы передать дескриптор файла в вызове exec () как часть argv [], он работает, но кажется, что это неправильное решение.

Я хочу знать, есть ли лучший способ сделать это. Кажется неудобным передавать файловые дескрипторы через аргументы.

1 Ответ

3 голосов
/ 07 сентября 2011

Дочерний процесс после fork наследует открытые файловые дескрипторы родителя.См. man 2 fork.

Хорошо.Мой первый совет для вас - собрать флаги -Wall -Wextra -pedantic, чтобы получить все предупреждения.Теперь мои изменения в вашем коде:

/*removed char pipe_readend[12];*/
char * arg[2] = {"test2", NULL}; /*first argument of program should be always it's name*/
char message[3] = {'h', 'i', '\0'}; /*c-string should be always terminated by '\0'*/
/*...*/
 case 0:
        /* child actions */
            close(pfd[1]); /* close write end */
            close(STDIN_FILENO); /*close standard input descriptor*/
            dup(pfd[0]); /*now standard input will be pfd[0]*/
            execve("test2", arg, NULL); /* start new process */
            break;

и test2.c

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

int main (void){
    char msg[3];
    read(STDIN_FILENO, msg, 3); /*read from standard input*/
    printf("test2: %s\n", msg);
    return 0;
}

Итак, подведем итог: после разветвления вы закрываете стандартный входной дескриптор и дублируете pfd [0],который станет новым стандартным вводом.Затем вызовите execve (), который использует pfd [0] в качестве стандартного ввода.Подробнее смотрите в man 2 функций fork, execve, pipe.

...