UNIX环境高级编程:进程管理和通信
|
setsid函数用于创建一个新的会话,并使得当前进程成为新会话组的组长 setsid函数能够使进程完全独立出来,从而脱离所有其他进程的控制。 #include <unistd.h> pid_t setsid(void) chdir(“/”) 改变工作目录 通常的做法是让“/”或”/tmp”作为守护进程的当前工作目录 。 在进程运行过程中,当前目录所在的文件系统是不能卸载的。 chdir函数可以改变进程当前工作目录 umask(0) 重设文件权限掩码 文件权限掩码是指文件权限中被屏蔽掉的对应位。把文件权限掩码设置为0,可以增加该守护进程的灵活性。设置文件权限掩码的 通常方法为umask(0) close(fd)关闭文件描述符 新建的子进程会从父进程那里继承所有已经打开的文件。 在创建完新的会话后,守护进程已经脱离任何控制终端,应当关闭用不到的文件。 fdtablesize = getdtablesize(); for (fd = 0; fd < fdtablesize; fd++) close(fd); 这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸载 从终端输入的字符不可能达到守护进程,守护进程中用常规的方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2的三个文件(对应标准输入、标准输出和标准错误这三个流)已经失去了存在的意义,也应被关闭。 启动: 在Linux系统启动时从启动脚本/etc/rc.d中启动,由作业规划进程crond启动 用户终端(通常是 shell)执行。 进程间的通信 AT&T的贝尔实验室,对Unix早期的进程间通信进行了改进和扩充,形成了“system V IPC”,其通信进程主要局限在单个计算机内 BSD(加州大学伯克利分校的伯克利软件发布中心),跳过了该限制,形成了基于套接字(socket)的进程间通信机制 传统的进程间通信方式 无名管道(pipe) 有名管道(fifo) 信号(signal) System V IPC对象 共享内存(share memory) 消息队列(message queue) 信号灯(semaphore) BSD 套接字(socket) UNIX IPC(InterProcess Communication) 无名管道pipe 特点: 只能用在有血缘关系的进程之间的通信、半双工(单方向的数据)。 类似于文件IO的读写,只存在于内存中。 创建: #include <unistd.h> int pipe( int fd[2] // fd:包含两个元素的整型数组( fd[0]固定用于读管道,而fd[1]固定用于写管道。) ); 返回值 成功:0, 出错:-1. pipe总结: 读端: 写端存在 管道中有数据,返回读取的字节数。 无数据,阻塞到有数据。 写端不存在 管道中有数据,返回读取的字节数。 无数据,返回0,所以,read返回0意味着写端关闭了。 写端: 读端存在 空间足,返回写入的字节数。 空间不足,有多少写多少,直到写完返回。 读端不存在 进程被SIGPIPE信号终止。 有名管道(FIFO) 特点: 类似队列、全双工(可读可写) 有名管道可以使互不相关的两个进程互相通信。有名管道可以通过路径名来指出,并且在文件系统中可见 进程通过文件IO来操作有名管道 有名管道遵循先进先出规则 不支持如lseek() 操作 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
