перенаправить конец чтения канала в дескриптор файла - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть два дочерних процесса, которые используют общие дескрипторы канала своих родителей. Нет проблем с закрытием концов и т. Д. Проблема в том, что я хочу перенаправить конец чтения канала в дескриптор файла, вместо того, чтобы хранить буфер и записывать содержимое буфера в файл. Является ли это возможным? Мой фрагмент кода, как следует

// we're sure we can read from fd[0], I did it sucessfully
// I mean there is no problem about the communication

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
if (dup2(open_fd,fd[0]) == -1) {
    perror("error ");
    return 1;
}
if (close(open_fd) == -1) {
    perror("close error");
    return 1;
}

Когда я делал приведенный выше код, я не записывал в файл с именем filename. Кстати, есть ли необходимость закрывать open_fd, вызывая close(open_fd)? Поскольку dup2 уже закрывает его.

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вы, вероятно, неправильно поняли цель dup2.Он просто меняет «значение» дескриптора файла, так что теперь он «указывает» на тот же поток, что и другой дескриптор.Но это никоим образом не передает данные из одного файлового дескриптора в другой.Чтобы действительно достичь желаемого, вы можете попробовать splice :

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
splice(fd[0], NULL, open_fd, NULL, size, 0);

Обратите внимание, что вам нужно будет указать, сколько данных вы хотите передать (переменная size в приведенном выше примере).

0 голосов
/ 05 апреля 2019

Когда я сделал приведенный выше код, я не пишу в файл с именем filename.

Конечно, нет.Когда вы вызываете dup2(open_fd,fd[0]), вы делаете целочисленное значение, хранящееся в fd[0], ссылающимся на тот же файл, что и open_fd, но это не имеет прямого отношения к тому, что происходит с байтами, переданными в конец записи канала,Он влияет на них только косвенно, заставляя номер файлового дескриптора, значение которого изначально было сохранено в fd[0], сначала закрываться, если он открыт.

Дескриптор файла - это, по сути, ключ к открытию целых чисел таблицыописания файлов в ядре.dup2() изменяет, к какому открытому описанию файла привязан целевой FD;он не изменяет само описание открытого файла и не влияет на его семантику, и на уровне , на котором живет канал, .

Байт, записанный в конец записи канала, получается из чтенияконец трубы, читая его.Тем не менее, вы делаете это, они изначально находятся в памяти и / или в регистрах процессора.Чтобы заставить их перейти оттуда к файлу, вам нужно отправить туда их.Например, вы можете настроить поток, целью которого является чтение любых доступных байтов из канала, а затем запись их в ваш файл.

...