进程守护+有名管道+无名管道

来源:互联网 发布:apache python3 编辑:程序博客网 时间:2024/04/28 20:38
1.守护进程:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
步骤(daemon.c):
1 利用系统调用signal()忽略信号SIGHUP
2 利用系统调用fork()创建一个子进程p1
2 在p1的基础上调用setsid(),创建一个新会话
3 利用系统调用fork()创建一个子进程p2
4 利用setpgrp()设置p2所在进程组
5 关闭所有文件描述符
6 消除umask()的影响
7 修改守护进程的当前工作路径



2.系统记录文件:
打开日志
openlog(pathname, LOG_PID,facility);

syslog(LOG_CRIT, “string”);  



void openlog(const char *ident, int option, int facility);   
openlog()打开一个程序的系统记录器的连接。本函数呼叫 UNIX 系统的 openlog() 函数,因此在 Windows 系列的操作系统中,本函数没有完全的实作。
1.idents指向的字符串可以是想要打出的任意字符,它所表示的字符串将固定地加在每行日志的前面以标识这个日志,该标志通常设置为程序的名称。
2.option参数所指定的标志用来控制openlog()操作和syslog()的后续调用。他的值为具体是下列值取或运算的结果

LOG_CONS    直接写入系统控制台,如果有一个错误,同时发送到系统日志记录。
LOG_NDELAY  立即打开连接(通常,打开连接时记录的第一条消息)。
LOG_NOWAIT  不要等待子进程,因为其有可能在记录消息的时候就被创建了(GNU C库不创建子进程,所以该选项在Linux上没有影响。)
LOG_ODELAY  延迟连接的打开直到syslog函数调用。(这是默认情况下,需要没被指定的情况下。)
LOG_PERROR (不在SUSv3情况下)同时输出到stderr(标准错误文件)。
LOG_PID 包括每个消息的PID。

.facility参数是用来指定记录消息程序的类型。它让指定的配置文件,将以不同的方式来处理来自不同方式的消息。
它的值可能为 LOG_KERN、LOG_USER、LOG_MAIL、LOG_DAEMON、LOG_AUTH、LOG_SYSLOG、LOG_LPR、LOG_NEWS、LOG_UUCP、LOG_CRON 或 LOG_AUTHPRIV




3.无名管道(pipe):
这里所说的管道主要指无名管道,它具有如下特点:


1.只能用于具有亲缘关系的进程之间的通信。


2.半双工的通信模式,具有固定的读端和写端。


3.管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。

管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,
而fd[1]固定用于写管道。




4.有名管道(fifo):

mkfifo(FIFO_NAME, 0666);  //创建
open(FIFO_NAME, O_RDWR); //打开
然后用read,write对这个FIFO_NAME的文件描述符进行操作即可
其实就是用管道文件作为中介来进行不同的应用程序和进程之间传输数据


1.无名管道只能用于具有亲缘关系的进程之间,这就限制了无名管道的使用范围


2.有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见


3.进程通过文件IO来操作有名管道


4.有名管道遵循先进先出规则


5.不支持如lseek()操作


错误警告:
EACCESS 参数filename所指定的目录路径无可执行的权限

EEXIST 参数filename所指定的文件已存在


ENAMETOOLONG 参数filename的路径名称太长


ENOENT 参数filename包含的目录不存在


ENOSPC 文件系统的剩余空间不足


EROFS 参数filename指定的文件存在于只读文件系统内







5.int access(const chat *filename ,int amode);
参数filename为要设置的文件名;参数amode为要设置的权限。
成功返回true;否则返回false


if(access(FIFO_NAME, F_OK))   //不存在返回1
{
rtv = mkfifo(FIFO_NAME, 0666);
if(rtv == -1)
{
perror("create fifo file failed\n");
return -1;
}


printf("create fifo\n");
}
0 0