OS X 是否支持 POSIX 会话?

Does OS X support POSIX sessions?

我正在从事一个可以很好地利用 POSIX 会话的项目(如所述here),但我现在不确定我是否误解了这个概念and/or 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
[...]

根据我的经验,Mac OSX 支持 posix 会话。 getsid() 系统调用有效。但是 ps 实用程序不会(ps -o sess 为所有进程生成 0)。

正如 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_eprocuser64_kinfo_proc 的成员。

user64_eproc 是数据结构(我猜) 有一个 e_psid 成员表示给定进程的会话 ID。因此,它没有成员。 fill_user64_eproc 使用进程的 struct session 设置一些标志并将进程的组 ID 记录到 user64_eproc 中,但它不记录会话 ID,因为没有地方可以放它。

有趣的是,ps 的源代码中有一个 ifdef 部分访问了 kinfo_proc.ki_sid。当然,这个成员也不存在。

所以,我确定 how 它没有返回,但不是 why,不幸的是。