守护进程就是没有控制终端,在后台运行。在系统自举时开始运行,直到系统停止运行。
那么守护进程的处理结构?怎样写一个守护进程并且如何知晓在系统出现错误的时候能及时的报告状态。
可能是因为daemons调用了setsid导致用户层的daemons没有控制终端。
所有的用户层的daemons是进程组的leader、sessionleader和process group和session 中的唯一线程。大部分的daemons的父进程是init进程。
错误日志记录
如何处理错误信息是守护进程必需面对的问题,不仅仅是写到标准错误输出上,因为没有控制终端。我们并不希望所有的daemons都将信息写到控制台上,
有很多基站,有的运行的是windows系统。我们也不希望每个daemon都将错误信息写入一个独立的文件中,需要一个控制daemon错误记录的工具。
类似于syslog的函数有这样的功能
在linux中,只有一个函数可以创建子进程:fork。
#include<sys/types.h> #include<unistd.h> pid_tfork(void);
由f o r k创建的新进程被称为子进程( childprocess)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程I D。将子进程I D返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数使一个进程可以获得其所有子进程的进程I D。f o r k使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用g e t p p i d以获得其父进程的进程I D (进程ID 0总是由交换进程使用,所以一个子进程的进程I D不可能为0 )。
使用fork()函数,返回的总是parent(返回值为child的pid)
Fork函数生成当前进程的子进程,从fork()语句后执行操作,可以根据返回的pid值为父进程和子进程分配工作。
#include<stdio.h> #include<unistd.h> main() { pid_t pid; printf(“Nowonly one process\n” ); printf(“Callingfork…\n”); pid=fork(); if (!pid) printf(“I’m thechild\n”); else if(pid>0) printf(“I’m theparent, child has pid %d\n”,pid); else print (“Forkfail!\n”); }覆盖原进程,而不是生成一个新的进程;
Exit()
Wait()
man 2 wait
若子进程终止了,但是父进程没有调用wait()方法等待回收,这个进程会变为”zombie”进程,所谓的僵死进程。内核会维护僵死进程的最少信息(pid,终止状态, 资源占用信息),为了等待父进程调用wait()来获取僵死进程的信息。若父进程忘记调用wait来回收子进程的资源,那么会占用内核的进程表,一旦进程表分配满了,会导致内核无法分配进程。如果父进程退出了,那么僵死进程会被init进程接管,init进程会自动调用wait来释放僵死进程占用的资源。
进程标识符pid
修改lib库的路径
vim /etc/ld.so.conf 加入/usr/local/lib(绝对路径)执行sudo ldconfig命令
修改~/.bashrc文件
# User specific aliases and functions set PYTHON_PATH=/usr/local/lib/python/ export PYTHON_PATH set PATH=$PYTHON_PATH:$PATH export PATH