项目中遇到的进程间通信方式

1)socket:经常遇到,不讲了

2)信号:使用kill发送信号,signal,settimer等系统调用都能对另一个进程发送信号,达到了进程间通信的目的。

kill(p1,16);    /*向进程号为p1的进程 发中断信号16*/

signal(SIGINT,go); /*接收到SIGINT信号后,转go函数去处理它*/

3)共享内存:使用mmap系统调用能够做到共享内存,mmap的使用方式是以fd为入参,两个进程都打开一个文件名,并用mmap将这个fd映射到各自的进程环境,使用mmap反射回来的虚拟地址直接进行读写。

项目中曾经,在系统启动时内核创建一个内存块,保存printk缓冲区,插入一个ko在需要的时候获取这个缓冲区地址,并拷贝到用户空间,在需要时,使用mmap进行进程间的通讯获取到这个地址中的值。

  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

  flength = lseek(fd, 1, SEEK_END);

  write(fd, "\0", 1); /* 在文件最后添加一个空字符,以便下面printf正常工作 */

  lseek(fd, 0, SEEK_SET);

  start_addr = 0x80000;

  mapped_mem = mmap(start_addr, flength, PROT_READ|PROT_WRITE,        //允许写入

  MAP_SHARED,       //允许其它进程访问此内存区域

  fd, 0);

4)消息队列:没有使用消息队列处理过进程间的通信。使用过类似消息的数组,处理过线程之间的数据共享。

5)信号量:没用过。

6)管道:pipe系统调用,数据只能单向流动,只能在亲缘关系的进程间流动。

项目中使用过无名管道,用来在c语言中调用shell脚本获得脚本的返回值。使用system系统调用执行脚本获得返回值,或者使用fork+exec系统调用新建子进程执行脚本。子进程中的返回值通过pipe返回给父进程。从而使得父进程能够获得子进程的返回值。

  int filedes[2];
    char buf[80];
    pid_t pid;
    pipe( filedes );

if ( (pid=fork()) > 0 )
    {
        printf( "This is in the father process,here write a string to the pipe.\n" );
        char s[] = "Hello world , this is write by pipe.\n";
        write( filedes[1], s, sizeof(s) );
        close( filedes[0] );
        close( filedes[1] );
    }
    else
    {
        printf( "This is in the child process,here read a string from the pipe.\n" );
        read( filedes[0], buf, sizeof(buf) );
        printf( "%s\n", buf );
        close( filedes[0] );
        close( filedes[1] );
    }
    
    waitpid( pid, NULL, 0 );

时间: 2024-10-29 00:09:04

项目中遇到的进程间通信方式的相关文章

node.js项目中使用coffeescript的方式汇总

Coffeescript作为Javascript低调的小弟实在是有过人之处,使用它可以增进开发效率,减少代码错误, 关键是能大幅提升开发愉悦感.我越来越觉得只要可能就在自己的项目中把coffee用起来. 然而也许你和我一样,在了解完coffeescript的语法后准备一试身手的时候,却面对如何把它引入项目而犯起愁来. 其实coffeescript这种语言因其可以一对一地翻译为javascript的特性,使用起来其实非常灵活. 将其引入项目的方式也不止一个.这里,我先就node项目引入coffee

Spring依赖注入——java项目中使用spring注解方式进行注入

注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.Controller.Repository.Component. Autowired是自动注入,自动从spring的上下文找到合适的bean来注入 Resource用来指定名称注入 Qualifier和Autowired配合使用,指定bean的名称 Service,Controller,Repository分别标记类是Service层类,Contro

C++项目中采用CLR的方式调用C#编写的dll

1.注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误.2.将C#的源码生成的"dll"文件复制到C++项目中的Debug目录下3.将C++项目属性设置为公共语言运行时支持4.在项目中导入dll文件和引用民命空间 #using "../debug/xxx.dll" using namespace xxxx; 5.实例化C#对象:CL ^cl = gcnew CL(); 6.调用C#带out string[] 参数的方法

node 关于项目中post和get方式的参数接收方法总结

post  req.body 此为一个数组 获取其中某个参数 可以加相应的健值,并且支持序列化,前台传参数ajax {"shopid":shopid,"ctype":ctype} 后台获取方式eq.body.shopid  适合查询类似的请求 get   url.prase(req.url).query  接收一个url地址的参数  前端直接连接传即可 url=/work?"+$('#aa').serialize() ,适合下载请求

项目中的小bug

最近在做电子书项目中,采用select方式输入子系统,运行后发现键盘输入没问题,可是触摸屏却没反应,触摸屏驱动没问题,tslib也移植正确.问题在哪呢? 在代码中加入打印语句: 54 static int isOutOf500ms(struct timeval *ptPreTime, struct timeval *ptNowTime) 55 { 56 int iPreMs; 57 int iNowMs; 58 59 iPreMs = ptPreTime->tv_sec * 1000 + ptP

深入浅出TypeScript(5)- 在React项目中使用TypeScript

前言 在第二小节中,我们讨论了利用TypeScript创建Web项目的实现,在本下节,我们讨论一下如何结合React创建一个具备TypeScript类型的应用项目. 准备 Webpack配置在第二小节项目的基础上做了一些修改, 添加React相关依赖:react.react-dom.@types/react 和@types/react-dom 修改Webpack配置文件 修改webpack.base.config.js,其余文件和第二小节保持一致,修改如下: const HtmlWebpackP

在基于MVC的Web项目中使用Web API和直接连接两种方式混合式接入

在我之前介绍的混合式开发框架中,其界面是基于Winform的实现方式,后台使用Web API.WCF服务以及直接连接数据库的几种方式混合式接入,在Web项目中我们也可以采用这种方式实现混合式的接入方式,虽然Web API或者WCF方式的调用,相对直接连接数据库方式,响应效率上略差一些,不过扩展性强,也可以调动更多的设备接入,包括移动应用接入,网站接入,Winfrom客户端接入,这样可以使得服务逻辑相对独立,负责提供接口即可.这种方式中最有代表性的就是当前Web API的广泛应用,促进了各个接入端

(21)项目中Hibernate Session的管理方式

1.openSession和getCurrentSession的区别 package com.rk.hibernate.cache; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.junit.Test; public class App_SessionInProject { private static Se

web项目中实现页面跳转的两种方式

<a href="javascript:"></a>跳转在网页本身,URL不改变 <a href="#"></a> 跳转在网页本身,URL 改变 java web项目中实现页面跳转的主要方式有两种:第一种,<% response.sendRedirect("index.jsp");%>第二种<jsp:forward page="index.jsp"/>我做