您尚未登录。

#1 2018-06-09 19:02:41

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

谁打开了stdin, stdout, stderr?

我猜想是内核在执行initramfs里的init的时候内核给它打开了,exec systemd的时候进程没主动关掉导致所有进程全继承了三个fd,除非主动关掉才能停止继承到子进程?@依云


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2018-06-09 20:45:43

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 谁打开了stdin, stdout, stderr?

对于终端,是让你登录到终端的程序。详情你可以查阅 APUE 对话期(session)和控制终端相关章节。
对于服务,是 systemd。

离线

#3 2018-06-10 00:20:38

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 谁打开了stdin, stdout, stderr?

依云 说:

对于终端,是让你登录到终端的程序。详情你可以查阅 APUE 对话期(session)和控制终端相关章节。
对于服务,是 systemd。

所以内核确实不会为进程打开文件描述符对吧,systemd主动打开的。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2018-06-10 00:47:18

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 谁打开了stdin, stdout, stderr?

xtricman 说:

所以内核确实不会为进程打开文件描述符对吧,systemd主动打开的。

当然的。

离线

#5 2018-12-19 13:03:57

yw662
大会员
所在地: localhost
注册时间: 2018-10-10
帖子: 424

Re: 谁打开了stdin, stdout, stderr?

显然是作为0 1 2三个文件描述符是继承自parent的,那么问题来了,
作为pid 1的parent的pid 0 idle,给pid 1的这三个又是什么呢。。。

我记得idle在整个生命周期内都没有动过这三个文件描述符。
那么说init和kthreadd都需要自己处理这三个文件描述符了?

那么initramfs的init在传递给switch root之后的真 init的时候,真init会重新初始化一遍么?

最近编辑记录 yw662 (2018-12-19 13:06:33)


ecmascript是世界上最好的语言

离线

#6 2018-12-19 13:19:09

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 谁打开了stdin, stdout, stderr?

处于内核态的 kthreadd 没有打开任何文件描述符。

离线

#7 2018-12-19 15:26:10

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: 谁打开了stdin, stdout, stderr?

yw662 说:

那么initramfs的init在传递给switch root之后的真 init的时候,真init会重新初始化一遍么?

取决于早期init,如果initramfs用了systemd貌似会代替一部分 真-systemd 的工作。。。最近似乎在根文件系统无法挂载的情况下,屏幕上产生了大量绿色日志,然后pvscan失败,我被initramfs-systemd扔到了emergency shell里。后来直接重新生成了initramfs,加了模块,没具体研究当时的情况。
否则的话,真-systemd 就不对原来的init做任何假设,应该会自己开一次文件描述符。毕竟也不能保证系统上的initramfs是啥个样子,存不存在,systemd依赖够多了,不能还依赖特定的initramfs吧。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

页脚