2024年4月28日发(作者:)

用户操作 Linux 下 stdin stdout stderr 的由来 收藏

现在就从linux kernel的源代码的角度来分析该。

二:fork()与execve()中stderr,的继承关系

其实用继承这个词好像不太准确,要准确一点,可能复制更适合.

首先有二点:

1:父进程fork出子进程后,是共享所有文件描述符的(实际上也包括socket)

2:进程在execve后,除了用O_CLOEXEC标志打开的文件外,其它的文件描述符都是会

复制到下个执行序列(注意这里不会产生一个新进程,只是将旧的进程替换了)

下面我们从代码中找依据来论证以上的两个观点.

对于第一点:

我们在分析进程创建的时候,已经说过,如果父过程在创建子进程的时候带了CLONE_F

ILES标志的时候,会和父进程共享task->files.如果没有定义,就会复制父进程的task->files.

无论是哪种情况,父子进程的环境都是相同的.

代码如下:

static int copy_files(unsigned long clone_flags, struct task_struct * tsk)

{

struct files_struct *oldf, *newf;

int error = 0;

oldf = current->files;

if (!oldf)

goto out;

if (clone_flags & CLONE_FILES) {

atomic_inc(&oldf->count);

goto out;

}

tsk->files = NULL;

newf = dup_fd(oldf, &error);

if (!newf)