- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是一个关于 Praveen Gollakota's 的答案的问题在 another question 中回答(这是我应该绕过评论特权的方式吗?)。
他对为什么 fork 两次这个问题的回答本质上是为了确保 fork 进程不是 session leader,因此无法获得 tty。他举了这个fork过程的例子,说明老二不是session leader(第二次fork后的SID不是老二的PID)。
1. `Parent` = PID: 28084, PGID: 28084, SID: 28046
2. `Fork#1` = PID: 28085, PGID: 28084, SID: 28046
3. `Decouple#1`= PID: 28085, PGID: 28085, SID: 28085
4. `Fork#2` = PID: 28086, PGID: 28085, SID: 28085
但是,您还可以在这里看到,在第一个 fork 之后和“分离”步骤之前(我假设这是对 setsid()
的调用),子进程不是 session 领导者。因此我的问题是为什么要调用 setsid()
?为什么不 fork 一次就退出?
我的猜测是,这与 session 领导者是控制终端(或其他祖 parent )有关。因此,后续问题是,组长退出但 session 组长仍然存在的进程会发生什么情况?
最佳答案
1. `Parent` = PID: 28084, PGID: 28084, SID: 28046
程序此时有一个控制终端。
2. `Fork#1` = PID: 28085, PGID: 28084, SID: 28046
此时程序仍然有一个控制终端。如果父进程退出,这个子进程将属于一个废弃的进程组。它可以setpgid()
到同一 session 中的另一个进程组。
3. `Decouple#1`= PID: 28085, PGID: 28085, SID: 28085
现在程序在另一个 session 中,无法setpgid()
切换到原 session 中的进程组。
4. `Fork#2` = PID: 28086, PGID: 28085, SID: 28085
重新访问init
。
关于linux - 为什么在 fork 之后调用 setsid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45200651/
我想将脚本作为进程运行。所以在命令下运行, setsid test.sh > test.log & 但报错如下, setsid: failed to execute test.sh: No such
守护进程时不调用 setsid() 有什么危险? 最佳答案 When a user logs out from a session, all processes associated with tha
致力于 Jehanne 的 POSIX 信号仿真,我意识到 standard没有解释调用 setsid() 的进程的现有子进程会发生什么。 我想知道他们是否留在之前的 session 和进程组中,或者
好吧,请耐心等待,谷歌上似乎有一些关于这个的答案,但我就是找不到。 我在 Django Celery 环境中经过两次 fork 后运行它。我不知道这些是否可以改变某些东西,但我认为它们没有。 没有太多
在 shell 脚本中,我看到使用 setsid,我们可以创建一个新的进程组。创建后,我找不到可靠的方法来获取组 ID。我的要求很简单,启动一个进程,完成后,清理任何后代(如果有的话)。我不想杀死主进
为了运行程序,我写了一个shell: #!/bin/bash ulimit -c unlimited ulimit -n 65535 /usr/local/bin/myprogram -D #-D h
我正在尝试在nodejs中执行bash shell - 除了作业控制之外我一直在工作。我很确定这是因为生成的进程没有被设置为进程领导者。在 C 语言中,我可以通过调用setsid()来做到这一点。在n
由于某些原因,我必须使用“setsid”来运行我的所有命令。 但是,当运行“setsid scp ~/aaa user1@10.170.3.17:/tmp/”时,出现了一个要求输入密码的对话框。通常,
这是一个关于 Praveen Gollakota's 的答案的问题在 another question 中回答(这是我应该绕过评论特权的方式吗?)。 他对为什么 fork 两次这个问题的回答本质上是为
在 fork() 之后,我执行了一个 setsid 来创建一个新 session 。但是当我这样做时,我不能使用像 emacs 这样使用 termcaps 的程序。它会出现错误 "emacs: Cou
此问题是 this question 的后续问题. 当 posix_spawn() 发出 bash 命令时,我收到消息: bash: no job control in this shell 我认为是
我正在尝试使用 Anaconda3(64 位)连接到 MongoDB。我正在使用的代码: import signal import subprocess proc = subprocess.Popen
我的意思是我不能在 bash 中使用它,它在 OS X 上不可用,还是我的 Mac 上没有它? 这不是 PATH 变量的问题,因为我用 find 命令搜索,我的 Mac 上根本没有名为 setsid
我知道 os.setsid() 是将进程( fork )组 ID 更改为自身,但为什么我们需要它? 我可以看到来自 Google 的一些答案是:在父进程退出时保持子进程运行。 但根据我下面的测试,如果
我试图获取我使用 setsid 运行的进程的 pid,它应该像这样在后台运行: test.sh: #/bin/bash setsid nohup ./my_program & echo $! 如果我运
$ cat test1.sh #!/bin/bash setsid sleep 100 'test1.sh' shell 脚本不会立即退出。 $ cat test2.sh #!/bin/bash se
我一直在研究创建 Unix 守护进程,似乎有两种方法。啰嗦的,搜索的时候好像会出现,就是再调用fork(),setsid(),fork(), chdir() 到安全的地方,设置 umask() 最后,
我试过man(3) setsid,但它只解释了如何使用它,我不太明白setsid什么时候有用? 最佳答案 session 是共享一个控制终端的一组进程。当你想开始一个新的 session 时,sets
为什么在 setsid() 之前使用 fork() 来守护进程? 基本上,如果我想将一个进程与其控制终端分离并使其成为进程组领导:我使用 setsid()。 在没有 fork 的情况下这样做是行不通的
我有一个示例代码,但我不知道如何弄清楚发生了什么。我只展示相关部分。问题是make_daemon()。 根据我对 fork 的理解,从 close(0) 开始的代码是由应该有 pid == 0 的子进
我是一名优秀的程序员,十分优秀!