我正在做一个可以充分利用POSIX会话的项目(如此处所述(,但我现在不确定我是否误解了这个概念和/或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
[...]
正如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
是数据结构(我猜(将有一个表示给定进程的会话 ID 的e_psid
成员。因此,它没有成员。 fill_user64_eproc
使用进程的struct session
来设置一些标志并将进程的组 ID 记录到 user64_eproc
中,但它不记录会话 ID,因为无处可放。
有趣的是,ps
的来源有一个ifdef
访问kinfo_proc.ki_sid
的部分。当然,这个成员也不存在。
所以,我确定它是如何没有返回的,但不幸的是,不知道为什么。
根据我的经验,Mac OSX确实支持posix会话。 getsid()
系统调用有效。 但是ps
实用程序不会(ps -o sess
为所有进程生成0
(。
FWIW,如果您在macOS上运行PowerShell,其Get-Process
命令将显示会话ID。它在每个进程上调用getsid()
来获取它。