我找到了一个获取'file'文件描述符的代码。代码如下。
{{1}}
不幸的是,代码没有提供为什么它可以通过exec获取文件描述符。即使在我阅读了bash手册之后,我也无法理解exec在这里执行的命令。有人知道上面代码的机制,请告诉我。非常感谢你。
答案 0 :(得分:3)
语法的特殊位是标识符周围的大括号。通常,您指定一个表达式,该表达式将评估为整数值,如
C:\Users\User>pypy -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of 3: 2.12 msec per loop
C:\Users\User>python -m timeit -n10 -s"from sympy import sieve" "primes = list(sieve.primerange(1, 10**6))"
10 loops, best of 3: 11.9 msec per loop
大括号包含一个名称,而不是一个整数,它要求shell为我们找到一个可用的描述符,打开该描述符上的文件,然后将名称设置为该值。
exec 3<file # Open file for reading on fd 3
fd=5
exec $fd<file # Open file for reading on fd 5
答案 1 :(得分:2)
这有点奇怪。
通常,当您运行程序时,您可以指定重定向:
cat 0<file #= cat <file
这基本上通过cat
为fork
创建了一个流程。然后opens
file
,dup
将其文件描述符添加到filedescriptor 0,然后exec
{s} cat
在子项内。
//Equivalent C code:
pid=fork();
//... (=error checking)
if(0==pid){
//child
int fd;
fd = open("file", O_RDONLY);
//...
dup2(fd, 0);
//..
execvpl("cat", "cat", (char*)0);
//..
}
如果您改为exec cat 0<file
,则不会fork
,
并且重定向和exec
调用将在当前进程中发生:
int fd;
fd = open("file", O_RDONLY);
//...
dup2(fd, 0);
//..
execvpl("cat", "cat", (char*)0);
//..
Shells重载exec
,这样如果没有提供exec
的程序,只会完成open
和dup
ing(它们一起转换为shell重定向)在当前的过程中。
这允许您重定向当前进程:
exec 0<file #standard input is the file "file" from this point forward
Bash和其他高级shell进一步扩展了这一点,允许您使用exec
语法简单地打开文件并获取文件描述符编号。
exec {fd}<file
基本上是他们的做法:
fd = open("file", O_RDONLY);