Перенаправление ввода из файла в exec () - PullRequest
2 голосов
/ 28 февраля 2012

Я делаю простую программу ANSI C, которая имитирует оболочку Unix.Поэтому я создаю дочерний процесс с помощью fork (), а внутри дочернего процесса я вызываю exec () для запуска данной (пользователем) программы.

Мне нужно перенаправить содержимое файла на стандартный ввод, чтобы его можно было отправить пользователю, называемому программой.

Example: cat < file \\user wants run cat and redirect content of that file to it by typing this to my program prompt

Я пытаюсь сделать это так:

...child process...

int fd = open(path_to_file, O_RDONLY);

int read_size = 0;
while ((read_size = read(fd, buffer, BUF_SIZE)) != 0) {
    write(STDIN_FILENO, buffer, read_size);
}
close(fd);

execlp("cat", ...);

Все идет хорошо, содержимое файла записывается в stdin, но после чтения всего файла, cat все еще ждет ввода (мне нужно сказать cat, что ввод закончился), но я не могу понять, как: - (?

Есть идеи? Спасибо большое !!!

1 Ответ

4 голосов
/ 28 февраля 2012

Внутри дочернего процесса перенаправьте стандартный ввод в ваш open 'ed дескриптор до вызова execlp через системный вызов dup2(2):

dup2(fd, 0);
execlp("cat", ...);

Вам не нужен цикл while в родительском элементе, так как cat сам будет читать из вновь перенаправленного дескриптора.

...