Чтение ввода из определенного файлового дескриптора - PullRequest
2 голосов
/ 01 мая 2011

Если я знаю, что входные данные для моей программы будут поступать из файлового дескриптора с (нестандартным) идентификатором, как мне с него читать?

Например, если мне нужно прочитать из файлового дескрипторас идентификатором 3, как мне это сделать?

Кроме того, есть ли простой способ проверить это в BASH без необходимости создания другой программы и конвейера?

Это то, что я получил до сих пор:

char buffer[100];
FILE* fd = fdopen(3, "r");
fgets(buffer, sizeof buffer, fd);
sscanf(buffer, "%d", &whatever);

Он компилируется, но при запуске выдает ошибку сегментации.Я посмотрел на него в GDB, и он застрял на Fgets, так что я думаю, что я делаю что-то не так?Возможно, из-за отсутствия конца файла, входящего в файловый дескриптор 3, когда я тестирую (опять же, было бы неплохо, если бы я мог правильно проверить это в BASH).

Ответы [ 2 ]

2 голосов
/ 01 мая 2011

В bash, предполагая, что ваш исполняемый файл "a.out", сделайте

./a.out 3< testfile

, чтобы тестовый файл был назначен дескриптору файла 3

Тот же вызов работает в bash, sh, zsh, ...
Не работает в csh, tcsh, ...

2 голосов
/ 01 мая 2011

Если вы ранее не открывали его, там есть нет файла с файловым дескриптором 3. fdopen() завершается ошибкой и, следовательно, fd равен NULL, что приводит к ошибке сегментации при попытке fgets() на это.

Всегда проверяйте возвращаемое значение ваших вызовов функций.

...