LINUX系统编程之IPC

发布时间:2020-07-11 14:22:07 作者:Czyy1
来源:网络 阅读:651

LINUX系统编程之IPC(Inter Processes Communication)

一、信号

1.信号的产生

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


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

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


3.信号操作函数

kill(), alarm(), raise(), abort(), pause()

typedef void (*sighandler_t)(int);signal()

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

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


二、管道/命名管道

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

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

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

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

int fd[2]; 

pipe(fd);

write();read();

close(fd);

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

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

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

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

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

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

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

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


2.命名管道FIFO

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

不相关的进程也能使用

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

mkfifo("./cmd_fifo", 0777);

open("./cmd_fifo", O_RDWR);

write();read();

close();


3.消息队列

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

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

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

发送消息msgsent(msqid, &msg, sizeof(msg)-4, 0);

接收消息msgrcv(msqid, &msg, sizeof(msg)-4, type, 0);返回长度

控制msgctl(msgqid, IPC_RMID, NULL)

typedef struct _msg

{

long mtype;

char mtext[50];

}MSG;

MSG msg;

key=ftok(".", 2012)

msgqid = msgget(key, IPC_CREAT|0666);

if(msgqid==-1)

perror("msgget");

msgrcv(msgqid, &msg, sizeof(msg.mtext), 10, 0);

msgctl(msgqid, IPC_RMID, NULL);


查看消息队列ipcs -q

删除消息队列ipcrm -q msgqid


4.共享内存

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

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

查看ipcs -m

删除ipcrm -m shmid

创建或打开int shmid = shmget(key, size, flag);

内存映射shmat()

解除映射shmdt()

控制shmctl()


推荐阅读:
  1. LINUX系统编程之线程
  2. IPC之信号量·即时通讯小程序(三)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux 系统编程 inux

上一篇:【C++】智能指针的原始写法、scoped写法、shared写法

下一篇:如何配置mysql环境

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》