进程知识点2

守护进程
进程间通信IPC
管道、有名管道、信号
共享内存、消息队列、线程、线程通信、线程互斥
线程同步、进程同步、考试题
守护进程Daemon
也叫后台进程或者精灵进程
守护进程在系统开机自动启动,生命周期长,关机的时候结束。
一般守护进程用于监测工作环境的。

前提:
	守护进程需要后台运行
	守护进程需要和终端脱离关系
思考:
	守护进程和终端脱离关系,所以,它的打印输出无法输出到终端
	守护进程需要记录和提示用户一些信息,可以写日志,还可以图形化界面提示
	在守护进程中按需来修改umask
相关概念
	进程 进程id 父进程 进程组 会话组
	父进程创建子进程,子进程会继承父进程的很多东西,比如:进程组、会话组
创建守护进程 *****
	创建新子进程,父进程退出
	创建新的会话组setsid();     //脱离终端 
	修改umask
	修改当前工作路径
	关闭继承来的已经打开文件
	做自己的事

进程间通信
掌握:有几种通信方式,分别有什么特点
管道(无名管道PIPE)
特点:
特殊的文件,没有名字
只能用于具有亲缘关系的进程间进行通信
半双工的通信模式,具有固定的读端和写端
父进程在创建管道后,会有读端fd[0]又有写端fd[1]
无法使用lseek进行光标跳转
管道为空,读阻塞;管道为满,写阻塞。
读完后,数据消失。

有名管道FIFO
	特点:
		可以用于同一个PC的任意两个进程间实现通信。
		在文件系统可见
		使用文件IO进行操作//open, read, write, close 
		管道为空,读阻塞;管道为满,写阻塞。
		无法使用lseek进行光标跳转
		
信号SIGNAL
	特点: 
		异步方式实现通信
		是软件层次去模拟中断来实现的。
	了解常见信号
		kill -l 
		ctrl-c : SIGINT
		ctrl-\ : SIGQUIT
		ctrl-z : SIGTSTP(暂停)
		SIGALRM(闹钟), SIGINT(终止), SIGSEGV(断错误), SIGABRT(内存溢出), SIGKILL(杀死), SIGSTOP(暂停)
	信号的产生
		kill();raise(); int alarm(int 秒);
	信号的处理
		默认处理 SIG_DFL
			大部分情况下会终止当前进程。
		忽略处理 SIG_IGN
			收到没有收到一样。
		捕获处理 //函数指针
			首先注册某个信号对应的处理函数,在当前进程收到该信号时,自动调用该函数。
			SIGKILL和SIGSTOP无法捕获处理也无法忽略处理。
	信号处理步骤 
		安装信号//注册信号对应处理函数
		做自己的事 
		
	相关函数:
		int alarm(int 秒); 启动定时器,定时时间到以后,会给当前进程发送SIGALRM.
		int pause(void); 暂停当前进程,直到收到信号为止。
		void (*signal(int signum, void (*handler)(int)))(int);
		或者
		#include 
		typedef void (*sighandler_t)(int);
        sighandler_t signal(int signum, sighandler_t handler);

练习题1:
通过无名管道来实现进程间通信。
步骤:
父进程 创建管道 pipe
创建子进程 fork
父进程:
关闭写端 close
读管道到buf中 read
输出buf printf
关闭读端 close
子进程:
关闭读端 close
写数据到管道中 write
关闭写端 close
相关函数
创建无名管道
#include
int pipe(int fd[2])
参数:
fd:是一个有两个整型元素的数组
返回值:成功的时候,返回0;失败时,返回-1.
练习题2:
通过有名管道来实现进程间通信。
1.c
int main()
{
//创建有名管道 mkfifo
//打开有名管道 open
//读文件 read
//输出 printf
//关闭文件 close
}
2.c
int main()
{
//创建有名管道 mkfifo
//打开有名管道 open
//写数据到文件中 write
//关闭文件 close
}
gcc 1.c
gcc 2.c
相关函数 :
#include
#include
int mkfifo(const char *pathname, mode_t mode);
参数:
pathname : 文件名
mode : 权限,一般用8进制表示,例:0666
返回值:成功的时候,返回0;失败时,返回-1。
例:
#include
ret = mkfifo( “myFifo”, 0666 );
if ( ret < 0 && errno != EEXIST)
{
perror(" mkfifo error ");
return 0;
}

你可能感兴趣的:(进程知识点2)