我的问题是我如何更改下面的程序,以便在命令行中使用文件描述符编号而不是文件名?任何帮助将不胜感激。谢谢。
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 */
答案 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”等,否则没办法。