OS X 是否支持 POSIX 会话?



我正在做一个可以充分利用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_eprocuser64_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()来获取它。

最新更新