Я имею в виду связать дескриптор файла с указателем файла и использовать его для записи. Я собрал программу io.cc
ниже:
int main() {
ssize_t nbytes;
const int fd = 3;
char c[100] = "Testing\n";
nbytes = write(fd, (void *) c, strlen(c)); // Line #1
FILE * fp = fdopen(fd, "a");
fprintf(fp, "Writing to file descriptor %d\n", fd);
cout << "Testing alternate writing to stdout and to another fd" << endl;
fprintf(fp, "Writing again to file descriptor %d\n", fd);
close(fd); // Line #2
return 0;
}
Я могу поочередно комментировать строки 1 и/или 2, компилировать/запускать
./io 3> io_redirect.txt
и проверьте содержимое io_redirect.txt
. Всякий раз, когда строка 1 не закомментирована, она создает в io_redirect.txt
ожидаемую строку Testing\n
. Если строка 2 прокомментирована, я получаю ожидаемые строки
Writing to file descriptor 3
Writing again to file descriptor 3
в io_redirect.txt
. Но если он не прокомментирован, эти строки не отображаются в io_redirect.txt
.
- Почему это?
- Как правильно использовать
fdopen
?
ПРИМЕЧАНИЕ. Кажется, это правильный подход для (частичного) ответа на Smart- запись в произвольный файловый дескриптор из C/C++ Я говорю "частичный", так как я смогу использовать C-стиль fprintf
. Я все еще хотел бы использовать stream<<
в стиле С++.
EDIT: я забыл о fclose(fp)
. Это «закрывает» часть вопроса.
fclose(fp):
, иfflush(fp): close(fd):
работают нормально. Будут ли они эквивалентны? - person sancho.s ReinstateMonicaCellio   schedule 17.05.2020