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_eproc
,user64_kinfo_proc
的成员。
user64_eproc
是数据结构(我猜) 会 有一个 e_psid
成员表示给定进程的会话 ID。因此,它没有成员。 fill_user64_eproc
使用进程的 struct session
设置一些标志并将进程的组 ID 记录到 user64_eproc
中,但它不记录会话 ID,因为没有地方可以放它。
有趣的是,ps
的源代码中有一个 ifdef
部分访问了 kinfo_proc.ki_sid
。当然,这个成员也不存在。
所以,我确定 how 它没有返回,但不是 why,不幸的是。
我正在从事一个可以很好地利用 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_eproc
,user64_kinfo_proc
的成员。
user64_eproc
是数据结构(我猜) 会 有一个 e_psid
成员表示给定进程的会话 ID。因此,它没有成员。 fill_user64_eproc
使用进程的 struct session
设置一些标志并将进程的组 ID 记录到 user64_eproc
中,但它不记录会话 ID,因为没有地方可以放它。
有趣的是,ps
的源代码中有一个 ifdef
部分访问了 kinfo_proc.ki_sid
。当然,这个成员也不存在。
所以,我确定 how 它没有返回,但不是 why,不幸的是。