Данный sample
запускается
./sample 4</some_file 5<some_other_file
это предоставит файловые дескрипторы, которые можно использовать для доступа к этим файлам:
int fd_for_some_file = 4;
int fd_for_some_other_file = 5;
Если вы не хотите предполагать, что файловые дескрипторы являются фиксированными значениями, не назначайте файлам жестко заданные значения дескрипторов при запуске процесса.
Редактировать:
Я хотел бы, чтобы программа узнала, какие fds были открыты при выполнении.
В общем, я не думаю, что вы можете.
Однако, если ваш код для определения предварительно открытых файловых дескрипторов запускается до любого вызова open
, вы можете просто просмотреть значения больше 2, чтобы увидеть, что они используют для конкретных ОС. В Linux:
for ( int fd = 3; fd < fd_max; fd++ )
{
sprintf( linkname, "/proc/self/fd/%d", fd );
int rc = readlink( linkname, linkvalue, sizeof( linkvalue ) );
if ( rc == 0 )
{
// found a file opened by calling process
}
}
Да, это по своей сути пикантно для многопоточных программ. Если вы используете GCC, вы можете поместить код в функцию с __attribute__(( constructor ))
, и она будет запущена до вызова main()
. Но даже это может идентифицировать файлы, открытые другими подобными функциями, как передаваемые родительским процессом.
person
Andrew Henle
schedule
19.03.2018
./sample 4 4<file1 5 5<file2
. Перенаправление происходит до запуска./sample
, поэтому он не знает, что произошло, пока вы ему не сообщите. - person Kevin   schedule 20.03.2018