我正在开发一个可以充分利用POSIX会话的项目(如here所述)但我现在不确定我是否误解了这个概念和/或OS X是否支持进程会话。
OS X 10.9有一个setsid(2)
系统调用但是用参数0, 0
调用它似乎注意到了。查看ps -e -o pid,pgid,sess
的输出显示所有进程的会话ID都为0
:
PID PGID SESS
1 1 0
11 11 0
12 12 0
13 13 0
14 14 0
15 15 0
16 16 0
17 17 0
[...]
OS X是否支持进程的POSIX会话,如果没有,是否存在另一种机制,例如: shell可以用来向从该shell启动的所有进程发送信号吗?
除了查看系统上的活动进程外,我还使用ersatz-setsid命令行工具在新会话中运行进程,但没有成功:
$ ./setsid sleep 1000
$ ps -eo pid,pgid,sess,command
PID PGID SESS COMMAND
[...]
10650 10650 0 sleep 1000
[...]
答案 0 :(得分:1)
根据我的经验,Mac OSX 确实支持posix会话。 getsid()
系统调用有效。但是ps
实用程序没有(ps -o sess
为所有进程生成0
。
答案 1 :(得分:1)
正如asynchronos指出的那样,macOS确实支持POSIX会话的概念,但是它没有通过ps(1)
或top(8)
查询会话ID的规定;这就是为什么您看到0。
要添加一些细节:
ps
使用sysctl(3)
收集正在运行的进程的列表。该列表以(对于64位计算机)struct user64_kinfo_proc
(xnu/bsd/sys/sysctl.h
)的数组形式返回。用户区域定义为struct kinfo_proc
(/usr/include/sys/sysctl.h
)。
处理该数组填充的内核函数为sysctl_prochandle()
(xnu/bsd/kern/kern_sysctl.c
)。
依次调用fill_user64_eproc
来填充struct user64_eproc
的成员user64_kinfo_proc
。
user64_eproc
是(我猜) 有一个e_psid
成员的数据结构,该成员表示给定进程的会话ID。因此,它没有成员。 fill_user64_eproc
使用进程的struct session
来设置一些标志,并将进程的组ID记录到user64_eproc
中,但是它没有记录会话ID,因为没有地方可以放置它。 / p>
有趣的是,ps
的源具有访问ifdef
的部分kinfo_proc.ki_sid
。当然,该成员也不存在。
因此,很遗憾,我确定如何不会返回,但是为什么。