Feu*_*mel 4 macos posix process
我工作的一个项目,该项目可以充分利用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
[...]
Run Code Online (Sandbox Code Playgroud)
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
[...]
Run Code Online (Sandbox Code Playgroud)
正如 asyncronos 指出的那样,macOS 确实支持 POSIX 会话的概念,但它没有通过ps(1)或查询会话 ID 的规定top(8);这就是为什么你看到 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. 当然,这个成员也不存在。
所以,我很确定它是如何没有返回的,但不知道为什么,不幸的是。
| 归档时间: |
|
| 查看次数: |
533 次 |
| 最近记录: |