1.软文推荐

2.软文推荐

3.软文推荐

进程虽然能够单独的运行并且完成一些任务,但是难免会和其他的进程进行数据传输或者消息通知,那么Linux系统中进程通信的方式有那些?下面良许教程网为大家分享一下Linux系统中进程通信的方式。

管道

管道是一种古老的IPC通信形式。它有两个特点:

半双工,即不能同时在两个方向上传输数据。有的系统可能支持全双工。

只能在父子进程间。经典的形式就是管道由父进程创建,进程fork子进程之后,就可以在父子进程之间使用了。

使用popen函数和pclose函数结合来执行系统命令,就用到了管道,它们声明如下:

 FILE *popen(const char *command,const char *type);
 int pclose(FILE *stream);

system()函数虽然也能够执行系统命令,但是无法获取执行状态码,而执行系统命令本质上就需要创建子进程来完成,因此利用管道可以很方便的获取子进程的输出内容。本文不详细展开。

我们看一个简单的使用管道的例子,这里使用了pipe函数来创建管道:

 #include 
 #include 
 #include 
 #define MAX_LEN 128
 int main(void)
 {
     /*0为读,1为写*/
     int fd[2] = {0}; //描述符
     pid_t pid = 0;
     char line[MAX_LEN] = {0};
     int n = 0;
 
     /*创建管道,需要传入两个文件描述符*/
     if(pipe(fd)  0)
     {
         /*关闭管道的写描述符*/
         close(fd[1]);
 
         /*从管道读取数据*/
         n = read(fd[0],line,MAX_LEN);
         printf("read %d bytes from pipe :%s
",n,line);
 
     }
     /*子进程*/
     else
     {
         /*关闭管道的读描述符*/
         close(fd[0]);
         /*向管道写入数据*/
         write(fd[1],"www.yanbinghu.com",sizeof("www.yanbinghu.com"));
     }
     return 0;
 }

在程序中,我们创建了一个管道,父进程关闭了写通道,子进程关闭读通道;子进程向管道内写入字符串,而父进程从管道中读取字符串并输出。

运行结果:

 read 18 bytes from pipe :www.yanbinghu.com
FIFO

FIFO也被称为命名管道,与管道不同的是,不相关的进程也能够进行数据交换。

涉及FIFO操作主要函数为:

 int mkfifo(const char *path, mode_t mode);

而FIFO也常常有以下两个用途:

无需创建中间临时文件,复制输出流

多客户-服务进程应用中,通过FIFO作为汇聚点,传输客户进程和服务进程之间的数据

我们看一个简单的例子,写进程代码如下:

 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #define FIFO "/tmp/fifo"
 #define MAX_LEN 128
 int main(void)
 {
     int writeFd;
     char line[MAX_LEN] = {0};
     if(mkfifo(FIFO,S_IRUSR|S_IWUSR) 

它首先创建了一个FIFO,并且打开后,往里面写入字符串,然后关闭退出。

读进程代码如下:

 #include 
 #include 
 #include 
 #include 
 #include 
 #include
 #define FIFO "/tmp/fifo"
 #define MAX_LEN 128
 int main(void)
 {
     int readFd,n;
     char line[MAX_LEN] = {0};
     /*打开FIFO,这里打开可能失败,应该要对返回值处理*/
     readFd = open(FIFO,O_RDONLY,0);
     /*从FIFO读取数据*/
 
     n = read(readFd,line,MAX_LEN);
     printf("read %d bytes from pipe :%s
",n,line);
     close(readFd);
     /*删除FIFO*/
     unlink(FIFO);
     return 0;
 }

它先打开一个已知的FIFO,然后从FIFO中读取数据。

在一个终端先运行写进程,然后运行读进程,结果如下:

 read 18 bytes from pipe :www.yanbinghu.com

我们可以看到,两个没有亲缘关系的进程可以通过FIFO进行通信。

消息队列

消息队列可以认为是一个消息链表,存储在内核中,进程可以从中读写数据。与管道和FIFO不同,进程可以在没有另外一个进程等待读的情况下进行写。另外一方面,管道和FIFO一旦相关进程都关闭并退出后,里面的数据也就没有了,但是对于消息队列,一个进程往消息队列中写入数据后退出,另外一个进程仍然可以打开并读取消息。消息队列与后面介绍的UNIX域套接字相比,在速度上没有多少优势。

信号量

信号量是一个计数器,它主要用在多个进程需要对共享数据进行访问的时候。考虑这一的情况,不能同时有两个进程对同一数据进行访问,那么借助信号量就可以完成这样的事情。

它的主要流程如下:

检查控制该资源的信号量

如果信号量值大于0,则资源可用,并且将其减1,表示当前已被使用

如果信号量值为0,则进程休眠直至信号量值大于0

也就是说,它实际上是提供了一个不同进程或者进程的不同线程之间访问同步的手段

共享内存

共享内存允许多个进程共享一个给定的存储区,由于它们是共享一块内存数据,因此其速度非常快。但是需要另外提供手段来保证共享内存的同步访问,例如它可以用到前面所提到的信号量来实现访问同步。

UNIX域套接字

UNIX域套接字和套接字很相似,但是它有更高的效率,因为它不需要执行协议处理,例如计算校验和,发送确认报文等等,它仅仅复制数据。

当然,它也只适用于同一台计算机上的进程间通信。

例如redis服务配置unixsocket启动后,通过redis-cli的-s参数就可以指定UNIX域套接字,连接到redis服务器。

 $ redis-cli -s /tmp/redis.sock
 redis /tmp/redis.sock>

它会比使用网络套接字的速度要快。

网络套接字

这个不用多说,它利用网络进行通信,与前面所提到的通信方式不同的是,它能用于不同计算机之间的不同进程间通信

至此关于Linux系统中进程通信的方式分享完毕,大家如果有疑问可以在评论区留言。

以上就是良许教程网为各位朋友分享的Linux系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你!

本文来源:www.lxlinux.net/1279.html,若引用不当,请联系修改。

相关文章 8

1

Linux 服务器的运行时间检查技巧 48秒前

有一点需要注意,使用uprecords不会马上就获得历史运行的时间记录,它是从安装 uptimed 之后开始记录的。 Linux 中的 uptime 用于查看系统启动...

2

详解核心交换机中链路聚合、冗余、堆叠、热备份 2分钟前

一、链路聚合 链路聚合是将两个或更多数据信道结合成一个单个的信道,该信道以一个单个的更高带宽的逻辑链路出现。 链路聚合一般用来...

3

韶关云服务器_韶关云主机/易探云免备案vps主机租用(韶关联动云公司) 4分钟前

易探云服务器( 韶关云主机 )真正的云计算架构云服务器,配备纯SSD架构打造的高性能存储,旨在为韶关企业和个人用户提供优质、高效、弹...

4

【便宜服务器】$49/月 E3-1220 8G内存 1T硬盘 20T流量 1Gbps 1IP 凤凰城 spryservers 6分钟前

spryservers是一家成立于2013年的主机商家,主要销售的产品有虚拟主机、VPS和独立服务器,机房位于美国达拉斯和凤凰城,线路方面到国内一...

5

【优惠】anyhk:香港HGC/WTT/HKT线路、台湾HiNet线路NAT套餐,大带宽,年付9折,月付88的 8分钟前

anyhk是一家专门销售NAT机器的商家,去年成立,已经稳定运营一年多了,常浏览本站的朋友应该知道,国内好多做NAT机器的商家都运营一段时...

6

#测评#傲云马来西亚三网双向CN2 VPS 10M不限流量月付100元起 9分钟前

傲云,一家老牌国人商家。2008年营运至今,主营国外云主机、VPS和独服。从2018年开始,全面提供免费主机(免费主机从最早的免费100M空间...

7

两个域名指向同一个网站,对网站优化有没有影响?(两个域名指向同一个ip) 12分钟前

权重分散不集中影响优化; 旧站内容已经收了,新站解析后内容无法再被收录,新站权重低无法运营起来; 旧站无法与新站对接,新站上线...

8

CentOS 7 下搭建RabbitMQ 14分钟前

RabbitMQ是一种消息队列 ,用于常见的进程通信。支持点对点,请求应答和发布订阅模式 并且提供多种语言的支持。常见的java,c#,php都支持。...