Linux: 进程间通信
来源:互联网 发布:js导出csv 编辑:程序博客网 时间:2024/06/01 20:42
进程:
目的:
- 数据传输: 一个进程数据发送给另一个进程.
- 资源的共享: 多个进程共享同样的资源.
- 通知事件: 一个进程向另一个或一组进程发送消息.
- 进程控制: 控制另一个进程.
现在Linux使用的进程间通信方式(IPC):
一.管道通信(先进先出,单向)
1.
int pipe(intfiledis[2])
filedis[0]:读管道.
filedis[1]:写管道.
关闭管道:close(filedis[0]);
必须先pipe()
否则子进程无法继承文件描述符.
2.
#include<sys/types.h>
#include<sys/stat.h>
int mkfifo(constchar *pathname, mode_t mode)
pathname:文件名.
mode:文件属性.
例子:
有名管道读写:
//read
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/home/benson/test/ben1"
main(int argc,char** argv)
{
}
//write
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO_SERVER "/home/benson/test/ben1"
main(int argc,char** argv)
{
}
二.信号通讯
几种常见的信号:
信号处理:
- 忽略信号. (SIGKILL 和 SIGSTOP 不能被忽略)
- 执行用户希望的动作.
- 执行系统默认的动作.(多数为终止该进程)
信号发送:#include<sys/types.h>
int kill(pid_tpid, int signo)
int raise(intsigno)
kill:可以向自身或者是其他进程发送信号.
raise:只可以向自己发送信号.
kill的pid值的情况:
- pid> 0 :将信号发送给进程ID为pid的进程.
- pid == 0:信号发送给同组的进程.
- pid< 0 :信号发送给|pid| (绝对值)的进程.
- pid == -1:信号发送给所有的进程.
信号等待:#include<unistd.h>
unsignedint alarm(unsigned int seconds)
seconds:经过指定秒数后产生信号.
intpause(void)
只有执行了一个信号,函数pause是进程等待收到一个信号为止,挂起才结束.
信号处理:#include<signal.h>
void (*signal(int signo ,
====>>typedef void (*sighandler_t)(int)
====》》sighandler_t
- func可能的值:SIG_IGN(忽略信号) ,SIG_DFL(按系统默认方式处理) , 自定义的函数名
三.共享内存:多个进程共享一部分的物理内存,共享内存是进程间数据共享的一种最快的方法.
int shmget(key_tkey, int size, int shmflg)
key:IPC_PRIVATE.
size:内存的大小.
shmflg:内存的属性.(文件属性)
返回值:返回共享内存的标识符,否则返回-1.
int shmat(intshmid, char *shmaddr, int flag)
shmid:共享内存的标识符.
flag:以什么方式映射内存.
shmaddr:一般为0(系统帮找一块)
解除映射:int shmdt(char *shmaddr)
四.消息队列:1.POSIX消息队列,2.系统V(5)消息队列(Linux特有)
功能:返回文件名对应的键值.
pathname:文件名.
proj:项目名.
int msgget(key_tkey, int msgflag)
key:键值.(从ftok中获取)
msgflg:属性.
返回值:与键值相对应的消息队列描述符.
int msgsnd(intmsqid, struct msgbuf *msgp, int msgsize, intmsgflg)
msgid:已经打开的消息队列,从msgget中获取.
msgp:存放消息的结构.
msgsize:消息的大小.
msgflg:属性,一般为IPC_NOWAIT
structmsgbuf
{
};
int msgrcv(intmsgid, struct msgbuf * msgp, int msgsize, long msgtyp, intmsgflg)
msgtyp:可以为getpid()
其余同上~~
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
struct msg_buf
int main()
{
}
- Linux: 进程间通信
- Linux 上实现双向进程间通信管道
- Linux环境进程间通信(二): 信号…
- Linux环境进程间通信(二): 信号…
- Linux环境进程间通信(二): 信号…
- Linux环境进程间通信(二): 信号…
- Linux进程间通信
- Linux进程间通信
- Linux进程间通信
- Linux进程间通信
- linux 进程间通信
- linux 进程间通信
- Linux进程间通信
- Linux进程间通信
- 【Linux】 进程间通信
- linux进程间通信
- Linux 进程间通信
- Linux进程间通信
- Linux:内核进程 (脑里面必有…
- Linux内存管理
- Bootloader and Uboot compiled, c…
- Linux:网络编程 (下)
- Linux:网络编程 (上)
- Linux: 进程间通信
- Linux : 线程(thread)
- Linux的一些头文件
- STL: map类的用法介绍1
- 图论: 匈牙利算法 Edmonds
- 图论: spfa == Shortest Path Fast…
- 图论: bellman_ford 求单源最短路…
- 图论: Bellman_ford + 队列 + 邻接…
- 图论: 邻接表 + STL优先队列 + dij…