管道:有名管道和无名管道
单向的,先进先出。写进程在管道尾部写入,读进程在管道头部读出数据
当数据被一个进程读出后,将被从队列中删除
若进程试图读空管道时,进程将堵塞
无名管道:
只能由父子进程使用
创建:int pipe(int fd[2])
fd[1]用于写管道,fd[0]用于读管道
注:必须在调用fork()之前调用pipe(),否则子进程将不会继承文件描述符
有名管道:不相关的进程也能交换数据
创建:int mkfifo(char *pathname,mode_t mode)
一旦创建FIFO,就可用open打开,close,read,write等都可以作用于FIFO
unlink() 删除数据
信号:
常见信号:SIGKILL,SIGSTOP,SIGCHILD,SIGTERM
信号处理:
忽略此信号:SIGKILL,SIGSTOP绝不能被忽略,它们向超级用户提供终止或停止进程的方法;
执行用户希望的操作;
执行系统默认的操作
发送信号的函数有:kill,raise
区别:raise 向自身进程发送信号;
kill可以向自身或其他进程发送信号
int kill(pid,signo)
int raise(sign)
alarm(int seconds) 每个进程只能有一个闹钟时间
信号处理主要方法:使用简单的signal函数;使用信号集函数组
signal(int signum,void (*func)(int))
共享内存
进程间共享数据最快的方法
共享内存实现:
创建:使用shmget
映射:将共享内存映射到具体的内存空间上,使用shmat
将共享内存从进程地址空间脱离:int shmdt(char *shmaddr)
消息队列:
消息队列就是消息的链表
进程可以添加新纪录,另一些进程可以从消息队列中读出信息
成功读取了一条消息后,队列中这条消息将被删除
系统V队列:只有在内核重启或人工删除时,该队列才被删除
创建:int msgget(key,msgflg)
返回消息队列描述字
发送消息:int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int flag)
接收消息:int msgrcv(int msqid,struct msgbuf *,int msgsz,long msgtype,int flag)
在msqid代表的消息队列中读取一个msgtype型消息,把消息存储在struct msgbuf结构中
信号量:
保护临界资源
用于访问控制,进程同步
分类:二值信号灯,计数信号灯
创建:semget
信号量处理:semctl(semid, 1,SETVAL,union_sem)
semctl(semid,0,RMID)
ipcs 查看共享内存,消息队列
ipcs -q 直接查看消息队列
ipcrm -q 序号 删除