进程间通信

Linux进程间有六种通信方式,分别是:管道(pipe),消息队列,共享内存,信号量,套接字,信号。
进程间通信(IPC,InterProcess Communication)是指进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。因为每个进程都有独立的用户地址空间和共享内核地址空间。所以两个进程通信时,需要将数据先给内核,这样,其他的进程才能取出数据。
对各个方式进行描述:
一、 管道(pipe)分为无名管道和命名管道。
无名管道,通过调用pipe()函数创建。做法是:1. 定义一个含有两个元素的整型数组,用来存放文件描述符。
2. 调用pipe()函数,生成管道。参数为整形数组名。
3. 调用fork()函数,生成子进程
4. 根据fork()函数返回值判断是父进程还是子进程
5. 若是父进程给子进程写数据,则应关闭父进程的读文件描述符,关闭子进程的写文件描述符,相反,同理。关闭文件读写文件描述符调用close()函数,调用read()和write()函数来进行读写操作。
命名管道,通过调用mkfifo()函数创建。用法同一班的文件描述符类似,可以实现open, close, read, write。mkfifo()有两个参数,第一个参数为管道名,第二个参数为读写属性,也是字符串。
管道的大小为1页,也就是4kB。
二、 消息队列(message queue):用msgget()函数来创建一个消息队列,用msgsnd()函数来发送消息,用msgrcv()函数来接收消息。
三、 共享内存(share memory):由一个进程创建一块儿共享内存区,其余进程可对这块内存区进行读写操作。利用shmget()函数来获得共享存储标识符。其余函数调用shmat()函数将共享内存区连接到自身的地址空间中,然后利用信号量 来对共享内存实现同步。
四、 信号量(semaphore):信号量在进程锁中已经记录过了,不再重复。
五、 套接字(socket):会有两个独立的主函数,一个是客户端,一个是服务端。
socket套接字函数: 1. 创建套接字 int socket(int domain, int type, int protocol)
2. 绑定套接字 int bind(int socket, const struct sockaddr * address, size_t address_len)
3. 监听套接字 int listen(int socket, int gacklog)
4. 接受连接 int accept(int socket, struct sockaddr *address, size_t *address_len) 5. 请求连接 int connect(int socket, const struct sockaddr *address, size_t address_len)
6. 关闭套接字 close(int socket)。
对于客户端: 1. 创建套接字
2. 请求连接到网络
3. 进行读写操作
4. 关闭套接字。
对于服务器: 1. 创建套接字
2. 绑定套接字
3. 监听套接字
4. (开始循环) 接受连接
5. 读写操作
6. 关闭套接字
六、 信号(signal)它在一个或多个进程之间传递异步信号。利用signal函数可以处理收集信号并执行信号处理函数。当我们在终端按下ctrl+c按键,进程就产生了一个终止信号,我们可以利用signal()函数截获这个信号并执行自己编写的信号处理函数。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值