程序如何访问继承的文件描述符?

时间:2017-07-31 11:21:42

标签: c linux api

在Linux API中,程序继承在其调用者中打开的文件描述符的副本。

程序如何访问继承的文件描述符?哪些功能用于此目的?

该程序的调用者可以是

  • C中的另一个程序,或

  • 一个bash shell。在这种情况下,程序如何访问在shell中打开的文件描述符来调用它?从Bash手册,在bash shell中,

      

    当要执行除内置函数或shell函数之外的简单命令时,将在包含以下内容的单独执行环境中调用它。除非另有说明,否则值将从shell继承。

         
        
    • shell的打开文件,以及重定向到命令所指定的任何修改和添加
    •   

感谢。

1 个答案:

答案 0 :(得分:3)

当您fork()新进程时,您的文件描述符仍然有效。你像往常一样访问它们:

int fd = open(/* ... */);
pid_t pid = fork();

if (pid == 0) {
    // We're the child.
} else if (pid > 0) {
    // We're the parent.
} else {
    // fork() failed.
}

父进程和子进程仍然可以访问fd。儿童过程没有什么特别要求;它可以正常访问fd

对于子进程是不同程序的情况,父进程需要将文件描述符传递给子进程。即使有办法找出所有打开的文件描述符,也无法分辨这些描述符所指的内容。它们来自贝壳吗?从节目?它只是随机数据。

因此,您需要通过管道或main()的参数或IPC机制进行沟通。换句话说,文件描述符并没有什么特别之处;他们需要像其他任何数据一样传达数据。

例如,bash脚本可能会打开一些文件,使用3和4作为文件描述符,然后告诉你的程序它使用哪些描述符:

#! /bin/bash

exec 3<> /tmp/newfile1
echo "This is file one." >&3

exec 4<> /tmp/newfile2
echo "This is file two." >&4

./myprogram 3 4

您的程序可以通过以下方式获取:

int main(int argc, char* argv[])
{
    fd1 = atoi(argv[1]);
    fd2 = atoi(argv[2]);

    // ... Obviously you'd need error-checking, but this is just an example.
}