1

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

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

4 回答 4

1

文件描述符应该被认为对于一个进程是唯一的。甚至 stdin/out/err 在两个独立进程的管道中也完全不同,但具有相同的 fd。

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

于 2009-10-29T07:45:21.227 回答
1

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

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

也就是说,我不得不问,这样做的目的是什么?

于 2009-10-29T06:23:50.987 回答
0

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

于 2009-10-29T07:47:05.357 回答
0

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

于 2009-10-29T06:31:30.737 回答