我有一个使用信号灯和共享内存的旧C ++ STL 11程序。它运行多年,就像一种魅力(Debian 7)。它在根目录下执行。
现在我迁移到新服务器(Debian 9),它在非root用户下运行。
程序在后台以&启动。
我在新环境中注销后,信号量消失了(ipcs时不再列出)。但是共享内存仍然可用,并且我不了解该过程也已执行。为什么不是所有IPC元素都以相同的方式处理?
有什么想法吗?
编辑如果我以sudo开头,则即使我注销该信号量也归root所有并存在。
注销时,任何由Shell在后台启动的进程都会得到SIGHUP。如果您的进程不处理该进程,它将终止。
[如果要保留以此方式启动的进程,则可以使用内置的disown
shell来避免这种情况,也可以使用nohup
启动该进程。
当您以root身份运行时成功的原因是,您的非特权用户无法发出root拥有的进程的信号,因此shell尝试这样做的尝试无声地失败。
在这种情况下,信号量是红色鲱鱼。