LINUX系统编程之IPC

LINUX系统编程之IPC(国米进程通信)

一、信号

1。信号的产生

软件中断,异步通信,ctrl + c,杀死函数,杀命令,硬件异常(段错误),软件异常


2。进程收到信号后可以用如下方法处理:

执行系统默认动作(终止),忽略此信号,执行自定义信号处理函数。


3。信号操作函数

杀死(),报警(),(),提高abort(),暂停()

typedef无效(* sighandler_t) (int);信号()

sigemptyset (), sigfillset (), sigismember (), sigdelset (), sigaddset () ....

信号阻塞集:阻塞信号的接收sigprocmask ();


二、管道/命名管道

1。无名管道:类似于一个文件,有2个文件描述符,只存在于内存

半双工,数据从写端入,读端出,先入先出,fd[0]输出,fd[1]写入

数据无格式要求,只固定大小,没有名字,用叉和vfork会继承其描述符

只有公共祖先进程使用,如父进程创建的管道只有该父进程和其子进程能访问

int fd [2];,

管(fd);

写();阅读();

关闭(fd);

阅读从管道中读取数据时会阻塞,有数据就读到返回,没数据则等待,

写从管道写数据,写满阻塞,直到数据被读出

如果读进程退出了,写进程写数据时也会退出可它用fcntl()设置阻塞特性

dup(旧)复制旧文件描述符并分配一个新的描述符,读写位置也会复制

dup2(旧的,新的)复制文件描述符,分配新的文件描述符新的,新的也标识旧所标识的文件

常用如重定向0,1,2描述符

int fd_stdout=dup(1);复制stdout描述符1

dup2 (fd_stdout 1);将描述符1重新分配给stdout


2。命名管道FIFO

有名字,存在于文件系统,内容只存在于内存

不相关的进程也能使用

命名管道复制后会变成普通文件

mkfifo (“。/cmd_fifo", 0777年),

开放(“。/cmd_fifo" O_RDWR);

写();阅读();

关闭();


3。消息队列

由内核维护的链表,消息有格式(结构体),消息有类型,可按照类型随机查询

有标识符,只有内核重启或人工删除才能删除

结构体第一个成员代表消息类型必须是长型变量,其它自行定义

发送消息msgsent (msqid,和味精,sizeof(味精)4 0);

接收消息msgrcv (msqid,和味精,sizeof(味精)4,类型,0),返回长度

控制msgctl (msgqid IPC_RMID, NULL)

typedef struct _msg

{

长mtype;

字符多行文字[50];

}味精;

味精味精;

键=ftok(“干净,2012)

msgqid=msgget(键,IPC_CREAT | 0666年),

如果(msgqid==1)

perror (“msgget");

msgrcv (msgqid,和味精,sizeof (msg.mtext), 10 0);

msgctl (msgqid IPC_RMID, NULL);


查看消息队列ipc - q

删除消息队列使用ipcs q msgqid


4。共享内存

多个进程共享给定的存储空间

最快的通信方式,访问互斥

查看ipc - m

删除使用ipcs - m shmid

创建或打开int shmid=shmget(大小,关键标志);

内存映射调用shmat ()

解除映射shmdt ()

控制shmctl ()


LINUX系统编程之IPC