Программа C в Linux для чтения дескриптора файла, переданного в качестве аргумента терминала

Я изучал различные дискуссии о том, как получить дескрипторы открытых файлов для текущего процесса в Linux из программы c, но не смог найти следующий пример:

./sample 4</some_file 5<some_other_file

Есть ли способ получить эти файловые дескрипторы в программе sample.c в этом случае. Я обнаружил, что эти перенаправления не рассматриваются как аргументы командной строки. Надеюсь, кто-то может помочь.

Конечно, fds 4 и 5 даны просто в качестве примера, я бы хотел, чтобы программа узнала, какие fds были открыты при выполнении.


person Luki    schedule 19.03.2018    source источник
comment
Вы можете просто использовать файловые дескрипторы 4 и 5 в коде. Вы спрашиваете, как программа может узнать, какие из них вы перенаправили?   -  person Kevin    schedule 19.03.2018
comment
Я отредактировал вопрос :) извините.   -  person Luki    schedule 19.03.2018
comment
Может быть, что-то вроде этого?   -  person Kevin    schedule 19.03.2018
comment
@Kevin Я смотрел на этот пример, но он почему-то не кажется элегантным ... Я подумал, что самым ясным способом было бы получить fds в качестве аргументов таким образом, если это возможно, конечно.   -  person Luki    schedule 19.03.2018
comment
Тогда вы, безусловно, можете передать fds в качестве аргументов: ./sample 4 4<file1 5 5<file2. Перенаправление происходит до запуска ./sample, поэтому он не знает, что произошло, пока вы ему не сообщите.   -  person Kevin    schedule 20.03.2018


Ответы (1)


Данный 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
comment
Я не имел в виду, что fds 4 и 5 были статическими. Я хочу узнать, какие fds были открыты после выполнения. Извините за неясный вопрос. - person Luki; 19.03.2018