У меня есть простая программа (рабочий пример):
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t my_pid = getpid();
char str[30];
sprintf(str, "/proc/%d/fd", my_pid);
printf("hello, I am gonna print out: %s", str);
execvp( "ls", (char *[]) { "ls", str, NULL } );
return 0;
}
скомпилирован с помощью gcc на виртуальной машине Linux. Мой вопрос в том, почему вывод, отправленный на printf, никогда не печатается.
Я понимаю, что printf буферизует свой вывод и сбрасывает только \n. Мне интересно, почему он не печатает в этом случае. Я читал, что потоки вывода сбрасываются при выходе из программы. printf буферизует выходные данные в malloc-й части памяти (я подтвердил это в своей реализации).
Мои вопросы по этому поводу (более подробная информация приветствуется):
execvp приводит к тому, что вывод печатается на stdout, но не печатается как есть? Я думаю, не будет ли это считаться завершением программы даже после того, как ls каннибализирует процесс?printf в памяти считаться выходным потоком?10 на zsh и 255 на bash не наследуются моим процессом."не будет ли это по-прежнему считаться выходом из программы" Нет.





execvp заменяет старый процесс новым процессом. Все открытые файловые дескрипторы остаются открытыми, но данные, буферизованные библиотекой C stdio, не сохраняются. Код запуска C прикрепит новый указатель FILE к файловому дескриптору STDOUT. Ключевым моментом является то, что файловый дескриптор является объектом ОС, тогда как указатель FILE является объектом библиотеки C. Сохраняется только объект ОС.
Соответствует ли FILE* буферизованной памяти (как в printf)? Почему необходимо иметь и FILE*, и файловый дескриптор? Если я закрою дескриптор файла STDOUT_FILENO, должен ли я ожидать, что FILE* stdout перестанет работать?
Или, другими словами: буферизованные данные хранятся в памяти, локальной по отношению к старому процессу, но поскольку этот полностью заменяется новым, прежний перестает существовать, прежде чем он сможет очистить буфер. Память об этом либо отбрасывается, либо повторно используется (перезаписывается) новым процессом.