OS X 是否支持 POSIX 会话?

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)

Jos*_*nch 6

正如 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. 当然,这个成员也不存在。

所以,我很确定它是如何没有返回的,但不知道为什么,不幸的是。


asy*_*nos 4

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