一个关于Linux守护进程创建的问题

冬生0 2014-04-16 09:58:03
大家好!有个关于Linux创建守护进程的问题请教各位,代码如下,问题在最后。
谢谢!
注:这个创建守护进程的过程不严谨,没有按照书上的来,请大家忽略这个,重点关注最后的问题。
#include <fcntl.h>
#include <sys/resource.h>
int daemonize(const char * cmd)
{
int ret = 0;
int i, fd0, fd1, fd2;
pid_t pid;

// clear file creation mask
umask(0);
//become a session leader to lose contrlling tty
if( (pid = fork()) < 0) //成为守护进程-------- 1
{
ret = -1;
printf("cant fork");
}
else if (pid !=0)
{
printf("parent");
ret = -1;
}

if(ret == 0)
{
sleep(20); // 等待sleep 20 秒 or do something else,------- 2
}
return ret;
}
int main()
{
int ret = 0;
printf("create a daemon\n");
ret = daemonize("daemon exp");
if(ret == 0)
printf("daemon create\n"); // 打印 ------- 3
sleep(30);
return 0;
}
// 问题:在1处已经成为守护进程,那么为什么还要在2处sleep20秒之后,才打印 3 处的" daemon create “ ?
我认为无论在2处做什么事情,都不影响3的输出,因为3在父进程中。
比如在服务器上先后创建守护进程a,b。a负责监听客户请求(类似于上面的2处),如果a一直在监听,没有返回,那么b进程是不是就无法创建了呢 ?
...全文
127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冬生0 2014-04-17
  • 打赏
  • 举报
回复
引用 2 楼 thefirstz 的回复:
因为父子进程哪个先调度不知道,加了sleep能保证print打印时候子进程已经创建了 b进程可以创建,因为是a进程阻塞了,创建a和b的父进程没有阻塞,可以继续创建子进程
嗯,的确,创建a和b的父进程没有阻塞,可以继续创建子进程。 现在的问题是 为什么 ‘3’处的打印会阻塞 20s 呢 ? 难道是3楼‘u014515312 ’ 说的那样 “2,3都是在子进程中才会执行 ” ?
冬生0 2014-04-17
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
没有说 2 必须吧
就创建一个守护进程来说,‘2’ 不是必须的, 但是现在打算让守护进程在 ‘2’的地方做一些事情。
妳是个好人 2014-04-17
  • 打赏
  • 举报
回复
2,3都是在子进程中才会执行
昵称很不好取 2014-04-17
  • 打赏
  • 举报
回复
因为父子进程哪个先调度不知道,加了sleep能保证print打印时候子进程已经创建了 b进程可以创建,因为是a进程阻塞了,创建a和b的父进程没有阻塞,可以继续创建子进程
zhxianbin 2014-04-17
  • 打赏
  • 举报
回复
没有说 2 必须吧
  • 打赏
  • 举报
回复
另外,你必须要把父进程和子进程区分开来,然后让子进程去做监听,父进程继续做其他事
  • 打赏
  • 举报
回复
sleep前的if条件应该是pid == 0吧,另外ret你一直没给赋其他值,一直是0

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧