Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos OSX支持POSIX会话吗?_Macos_Process_Posix - Fatal编程技术网

Macos OSX支持POSIX会话吗?

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

我正在从事一个可以很好地利用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
    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限制而无法提供信息。