вопрос об изменении номера дескриптора файла в c - PullRequest
1 голос
/ 29 октября 2009

мой вопрос: как мне изменить программу, указанную ниже, чтобы она заняла номер дескриптора файла в командной строке, а не имя файла? Любая помощь будет принята с благодарностью. Спасибо.

include "csapp.h"

int main (int argc, char **argv) 

{

    struct stat stat;
    char *type, *readok;

    /* $end statcheck */
    if (argc != 2) {
        fprintf(stderr, "usage: %s <filename>\n", argv[0]);
        exit(0);
    }
    /* $begin statcheck */
    Stat(argv[1], &stat);
    if (S_ISREG(stat.st_mode))     /* Determine file type */
        type = "regular";
    else if (S_ISDIR(stat.st_mode))
        type = "directory";
    else 
        type = "other";
    if ((stat.st_mode & S_IRUSR)) /* Check read access */
        readok = "yes";
    else
        readok = "no";

    printf("type: %s, read: %s\n", type, readok);
    exit(0);
}
/* $end statcheck */

Ответы [ 4 ]

1 голос
/ 29 октября 2009

Файловые дескрипторы должны считаться уникальными для процесса. Даже stdin / out / err совершенно разные в трубе для двух отдельных процессов, но имеют одинаковый fd.

Конечно, есть много способов создать новый процесс, но если вы используете тот, который сохраняет ваши fd, вы все равно не будете передавать их в командной строке.

1 голос
/ 29 октября 2009

Легко делать то, что ты хочешь. Вам нужно будет преобразовать argv [1] из строки в целое число (используя strtol), а затем вы измените вызов stat () на fstat (). Если вам не нужно проверять, что аргумент на самом деле является числом (то есть дескриптором файла), вы можете просто изменить вызов stat () на:

fstat(atoi(argv[1]), &stat);

Тем не менее, я должен спросить, какова цель этого?

0 голосов
/ 29 октября 2009

Поскольку номер FD является свойством для каждого процесса (и, возможно, его дочерних элементов), поэтому только в том случае, если родительский процесс имеет собственный fd открытого файла, дочерний элемент (как правило, разветвленный) может принять унаследованный номер fd в качестве команды. параметр и использовать его; в противном случае это невозможно, если не использовать хорошо известные «STDOUT» или «STDERR» и т. д.

0 голосов
/ 29 октября 2009

Попытка что-либо сделать с дескриптором файла, который не был открыт внутри вашего процесса или родительского процесса, не будет работать. Файловый дескриптор просто уникален в вашем / родительском процессе (ах).

...