Macos OSX支持POSIX会话吗?
我正在从事一个可以很好地利用POSIX会话(如上所述)的项目,但我现在不确定我是否误解了这个概念和/或OSX是否支持进程会话 OSX10.9有一个Macos OSX支持POSIX会话吗?,macos,process,posix,Macos,Process,Posix,我正在从事一个可以很好地利用POSIX会话(如上所述)的项目,但我现在不确定我是否误解了这个概念和/或OSX是否支持进程会话 OSX10.9有一个setsid(2)系统调用,但用参数0,0调用它似乎没有什么作用。查看ps-e-opid、pgid、sess的输出,可以发现所有进程的会话ID都是0: PID PGID SESS 1 1 0 11 11 0 12 12 0 13 13 0
setsid(2)
系统调用,但用参数0,0
调用它似乎没有什么作用。查看ps-e-opid、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启动的所有进程发送信号
除了查看系统上的活动进程外,我还使用命令行工具在新会话中运行进程,但没有成功:
$ ./setsid sleep 1000
$ ps -eo pid,pgid,sess,command
PID PGID SESS COMMAND
[...]
10650 10650 0 sleep 1000
[...]
根据我的经验,MacOSX确实支持posix会话。getsid()
系统调用有效。但是ps
实用程序并不(ps-oses
为所有进程生成0
)正如异步操作系统所指出的那样,macOS确实支持POSIX会话的概念,但它没有通过ps(1)
或top(8)
查询会话id的规定;这就是为什么你会看到0
要添加一些细节:
ps
使用sysctl(3)
收集正在运行的进程列表。该列表以数组形式返回(对于64位机器)struct user64\u kinfo\u proc
(xnu/bsd/sys/sysctl.h
)。用户土地定义为struct kinfo_proc
(/usr/include/sys/sysctl.h
)
处理该数组填充的内核函数是sysctl\u prochHandle()
(xnu/bsd/kern/kern\u sysctl.c
)
它依次调用fill\u user64\u eproc
来填充struct user64\u eproc
,它是user64\u kinfo\u proc
的成员
user64\u eproc
是一种数据结构,我猜它会有一个e\u psid
成员,表示给定进程的会话id。因此,它没有成员fill_user64_eproc
使用进程的struct session
设置一些标志并将进程的组id记录到user64_eproc
中,但它不会记录会话id,因为没有地方可以放置它
有趣的是,ps
的源代码有一个ifdef
'd部分,用于访问kinfo_proc.ki_sid
。当然,这个成员也不存在
因此,我确信它不会被返回,但不幸的是,它不会被返回 看到测试程序会很有帮助。@ThomasDickey更新了。我提到了这一点,因为在POSIX中它指出“此函数要求调用进程不是进程组长”。因此,我希望测试程序能够fork,为每个fork进程执行setsid,并报告各种会话id(通过ps的管道等)。感谢您的详细解释!遗憾的是,#ifdef
没有进入手册页,例如,通知用户此处安装的版本由于内核API限制而无法提供信息。