有关在c中更改文件描述符编号的问题

时间:2009-10-29 06:06:48

标签: c numbers file-descriptor

我的问题是我如何更改下面的程序,以便在命令行中使用文件描述符编号而不是文件名?任何帮助将不胜感激。谢谢。

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 个答案:

答案 0 :(得分:1)

很容易做你想做的事。您需要将argv [1]从字符串转换为整数(使用strtol),然后您将调用从stat()更改为fstat()。如果你不关心验证参数实际上是一个数字(这是文件描述符是什么),你可以简单地将stat()调用更改为:

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

那就是说,我不得不问,这个目的是什么?

答案 1 :(得分:1)

文件描述符应被视为流程的唯一。甚至stdin / out / err在两个独立进程的管道中完全不同,同时具有相同的fd。

当然有很多方法可以创建一个新进程,但是如果你使用一个保留你的fd的方法,你就不会在命令行中传递它们。

答案 2 :(得分:0)

尝试对未在进程或父进程中打开的文件描述符执行任何操作将无效。文件描述符在您的进程/父进程中是唯一的。

答案 3 :(得分:0)

因为FD编号是每个进程(可能是其子进程)属性,所以只有当父进程拥有一个打开文件的fd时,子进程(通常是分叉的)才能接受继承的fd编号作为命令参数并使用它;否则,除非使用着名的“STDOUT”或“STDERR”等,否则没办法。