gpt4 book ai didi

c++ - 使用 _exit() 在守护进程中进行 fork() 系统调用

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:35 25 4
gpt4 key购买 nike

关于 fork() 有很多问题,但我对这段代码有点困惑。我正在用 c++ 分析一段代码,因为我得到了这个函数。

int daemon(int nochdir, int noclose) 
{

switch (fork())
{
case 0: break;
case -1: return -1;
default: _exit(0); /* exit the original process */
}

if (setsid() < 0) /* shoudn't fail */
return -1;

/* dyke out this switch if you want to acquire a control tty in */
/* the future -- not normally advisable for daemons */
printf("Starting %s [ OK ]\n",AGENT_NAME);

switch (fork())
{
case 0: break;
case -1: return -1;
default: _exit(0);
}

if (!nochdir)
{
chdir("/");
}

if (!noclose)
{
dup(0);
dup(1);
}

return 0;
}

因此,fork 将从调用 fork() 的位置创建代码的精确拷贝。所以,

  1. switch是执行两次还是一次?

  2. 如果是两次,那么在切换中如果 child 先执行怎么办?它会中断还是转到其他语句?

  3. 如果父级执行怎么办?主进程会终止,子进程会继续吗?

编辑:因此,开关也将运行两次,一次与父级一起运行,一次与子级一起运行。并对返回值进行操作。

最后一点是,守护进程是一个预定义的函数,它已被重新定义并像用户创建的守护进程一样使用。它将如何创建守护进程以及什么

`if (!nochdir)    
{
chdir("/");
}`

if (!noclose) 
{
dup(0);
dup(1);
}

我是这样调用这个函数的。

if (daemon(0, 0) < 0) 
{
printf("Starting %s [ Failed ]\n",AGENT_NAME);
exit(2);
}

最佳答案

Is switch executed twice or once?

据说fork是调用一次返回两次的函数,即每个进程一次:父进程一次,子进程一次。

男人:

On success, the PID of the child process is returned in the parent, and 0 is returned in the child. On failure, -1 is returned in the parent, no child process is created, and errno is set appropriately

它可能只返回一次 (-1):如果未创建子项,则仅在父项中返回。它总是在父级中返回(错误时返回 -1,成功时返回 > 0)。

If twice then in the switch what if the child executes first? Will it just break or go to the other statements?

未知是 child 还是 parent 先返回。在 fork() 之后,所有内存段都被复制到子进程中,但它继续使用从 fork() 返回的正确值 0。 parent 继续使用 child 的 pid。您在代码中使用 fork 的返回值来确定您是 child 还是 parent 。如果你这样写代码,也许这会变得更清楚

int daemon( int nochdir, int noclose) 
{

pid_t pid; /* to drive logic in the code */

if ( ( pid = Fork()) < 0) /* fork and remember actual value returned to pid */
return -1;

if( pid > 0)
_exit(0); /* exit the original process */

// here pid is 0, i.e. the child

What If the parent executes? will the main process be terminated and child will continue?

如果在任何子指令之前调用父 exit() 怎么办?那么是的, parent 会终止, child 会自己做。父进程和子进程拥有相同的代码段,但彼此独立执行(除非您添加了一些同步)。

http://linux.die.net/man/2/fork

关于c++ - 使用 _exit() 在守护进程中进行 fork() 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24424605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com