在Linux中分叉并使用setsid()

时间:2014-05-21 15:08:49

标签: c linux fork

我有一个示例代码,我无法理解如何弄清楚发生了什么。 我只展示相关部分。问题是make_daemon()

根据我对分叉的理解,来自close(0)的代码由具有pid == 0的孩子执行。

当代码点击return -1时会发生什么?代码是返回父级还是退出?子进程代码是否在Monitor()中执行if(share)?

此代码是mdadm中Monitor.c的摘录。

提前感谢您的帮助。

int Monitor( struct mddev_dev *devlist,
    char *mailaddr, char *alert_cmd,
    struct context *c,
    int daemonise, int oneshot,
    int dosyslog, char *pidfile, int increments,
    int share )
{
    if (daemonise) {
        int rv = make_daemon(pidfile);
        if (rv >= 0)
            return rv;
    }
    if (share)
        if (check_one_sharer(c->scan))
            return 1;
    /* etc .... */
}

static int make_daemon(char *pidfile)
{
    int pid = fork();
    if (pid > 0) {
        if (!pidfile)
            printf("%d\n", pid);
        else {
            FILE *pid_file;
            pid_file=fopen(pidfile, "w");
            if (!pid_file)
                perror("cannot create pid file");
            else {
                fprintf(pid_file,"%d\n", pid);
                fclose(pid_file);
            }
        }
        return 0;
    }
    if (pid < 0) {
        perror("daemonise");
        return 1;
    }
    close(0);
    open("/dev/null", O_RDWR);
    dup2(0,1);
    dup2(0,2);
    setsid();
    return -1;
}

1 个答案:

答案 0 :(得分:0)

fork可以返回三种类型的返回值:

  • 正数:这只发生在父母身上:它是成功创建的孩子的pid。
  • 零:这仅在子项中返回,表示此代码现在在子项中执行。这是孩子的pid,使用getpid来获取孩子的pid。
  • 负值(通常为-1)。这也只是在父级中返回,表示fork因任何原因失败而且没有创建子级。

关于你的代码的作用:是的,如果确实创建了一个孩子,孩子将继续close(0);

当您的cild命中return -1时,它将返回到父级中的任何名为make_daemon的函数,并将在该点继续执行。通常分叉的孩子会做他们应该做的任何事情,然后打电话给exit,以免弄乱父母在做什么。