我有一个示例代码,我无法理解如何弄清楚发生了什么。
我只展示相关部分。问题是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;
}
答案 0 :(得分:0)
fork
可以返回三种类型的返回值:
getpid
来获取孩子的pid。-1
)。这也只是在父级中返回,表示fork
因任何原因失败而且没有创建子级。关于你的代码的作用:是的,如果确实创建了一个孩子,孩子将继续close(0);
。
当您的cild命中return -1
时,它将返回到父级中的任何名为make_daemon
的函数,并将在该点继续执行。通常分叉的孩子会做他们应该做的任何事情,然后打电话给exit
,以免弄乱父母在做什么。