文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

常见的Linux进程通信方法是什么

2023-06-28 14:29

关注

这篇文章主要为大家分析了常见的Linux进程通信方法是什么的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“常见的Linux进程通信方法是什么”的知识吧。

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

管道

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

使用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) {          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",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也常常有以下两个用途:

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

 #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};          readFd = open(FIFO,O_RDONLY,0);           n = read(readFd,line,MAX_LEN);     printf("read %d bytes from pipe :%s\n",n,line);     close(readFd);          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进程通信方法是什么”就介绍到这了,更多相关内容可以搜索编程网以前的文章,希望能够帮助大家答疑解惑,请多多支持编程网网站!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯