Linux Daemon(守护进程)是运行在后台的一种特殊进程。
Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。
一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
像这样:
> make &
让编译命令make到后台执行,这样只是造成了make在后台一直运行的假象,实际上只是释放了terminal,它依然没有脱离和terminal之间的父子关系;
当terminal退出后,make依然会退出。所以针对daemon进程就要用特殊的步骤来编写,以保证在terminal中执行后,
即使terminal退出,daemon进程仍然在后台运行。
创建deamon程序的过程:
1.umask(0);//因为我们从shell创建的daemon子进程,所以daemon子进程会继承shell的umask,如果不清除的话,会导致daemon进程创建文件时屏蔽某些权限。
2.pid = fork() //fork后让父进程退出,子进程获得新的pid,肯定不为进程组组长,这是setsid前提。
3.setsid();//创建新的进程会话。这使得daemon进程成为会话首进程,脱离和terminal的关联。
4.chdir("/") //将当前工作目录切换到根目录。父进程继承过来的当前目录可能mount在一个文件系统上,如果不切换到根目录,那么你就要防止这个文件系统被unmount。
还有一些不是必要的步骤,遇到了再查吧
那么gdb如何调试子进程呢?set follow-fork-mode child