shell关闭文件描述符num 19

时间:2016-01-27 17:29:34

标签: shell unix exec fork file-descriptor

调试我的应用程序我发现shell解释器的奇怪行为(Solaris上的/ bin / sh,Debian中的/ bin / dash)。虽然由shell关闭了shell文件描述符中的fork()数字19(dec)。在我的情况下,它会导致进程之间关闭通信套接字对。

查看shell源代码我发现了onethis

为简洁起见:

/* used for input and output of shell */
#define     INIO        19

if (input > 0) {
    Ldup(input, INIO);
    input = INIO;
}

...

static void
Ldup(int fa, int fb)
{
    if (fa >= 0) {
        if (fa != fb) {
            close(fb);
            fcntl(fa, 0, fb); /* normal dup */
            close(fa);
        }
        fcntl(fb, 2, 1);    /* autoclose for fb */
    }
}

所以netto只是关闭FD号码INIO(19);

简单的复制测试:

$ exec 19>&1
$ echo aaa >&19
aaa
$ bash -c 'echo aaa >&19'
aaa
$ dash -c 'echo aaa >&19'
dash: 1: Syntax error: Bad fd number
$ ksh -c 'echo aaa >&19'
aaa

问题是:

  • 这种奇怪行为的原因是什么?
  • 文件描述符19有什么问题?

1 个答案:

答案 0 :(得分:1)

19是特殊的,因为(很久以前),打开文件的最大数量是20,例如,

#define _NFILE  20
stdio.h

中的

在POSIX中,您可以通过sysconf界面看到其他符号,例如OPEN_MAX

  • 文件描述符从0开始计算,
  • 通常按递增顺序分配
  • 所以“最后可能”的文件描述符应为19。
  • 如果有一个未使用的文件描述符,那么 last 就会“工作”。

Solaris sh(特别是通过Solaris 10)和dash都可以追溯到一段时间,您注意到的细节可能并没有破坏任何重要的遗留shell脚本(很多)。