OS X是否支持POSIX会话?

时间:2016-02-07 00:28:01

标签: macos process posix

我正在开发一个可以充分利用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
[...]

2 个答案:

答案 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_procxnu/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。当然,该成员也不存在。

因此,很遗憾,我确定如何不会返回,但是为什么