Linux进程通信 有名管道实现守护进程

有名管道实现守护进程

问题:如果一个进程出现了问题怎么判断它是否在运行?能否重启这个进程?尝试用守护进程操作。

 

解决方案:有名管道实现守护进程

         守护进程(主进程)一直读取管道信息,进行后台监测 若一段时间未读到,认为子进程挂掉——>杀死子进程——>捕捉信号SIGCHLD 确定进程已不存在——重新创建新的子进程

子进程(前台进程)管道写入

 

守护进程(daemon

守护进程是运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待某些发生的事件。由于在Linux中,每个系统与用户进行交流的界面成为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端被称为这些进程的控制终端,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行,并且它脱离终端的目的是为了避免进程在运行的过程中的信息在任何终端中显示并且进程也不会被任何终端所产生的终端信息所打断。它从被执行的时候开始运转,直到整个系统关闭才退出(当然可以认为的杀死相应的守护进程)。如果想让某个进程不因为用户或中断或其他变化而影响,那么就必须把这个进程变成一个守护进程。

fork()函数创建父子进程

fork闯进的新进程被称为子进程(child process)。该函数被调用一次,但返回两次,有三种可能的返回值。 fork之后,操作系统会复制一个与父进程完全相同的子进程,这两个进程共享代码空间,但数据空间互相独立,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器PC的值相同,也就是说,子进程是从fork返回处开始执行的)。但有一点不同,如果fork成功,子进程中的fork的返回值是0,父进程的返回值是子进程的进程号。

父子进程创建后,执行顺序不确定(vfork创建的是子进程先执行),有可能多次运行的表现不一样,因为进程是由内核调度的,非人力可以预测。

fork()函数创建子进程时,当父进程在运行时,终端都会被阻塞(即不能对当前终端进行任何操作,除非结束父进程);然而,只要父进程结束,不管子进程是否结束,终端都会解除阻塞(即在子进程运行的同时,当前终端也可以进行其他操作)。

你可能感兴趣的:(Linux,C)