linux应用之----进程通信

原创 2012年03月22日 19:19:47

进程间通信基础

进程间通信的英文缩写: IPC 

为什么需要进程间通信?数据传输,资源共享,通知事件,进程控制等。

Linux进程间通信方式(6种):管道,信号,消息队列,共享内存,信号量,套接字。

各种进程间通信方式详解

    1 :管道通信

                int pipe (int name[2])

    1):成功返回0;失败返回-1;

    2):用于父进程与子进程之间的通信。执行了该函数后,相当于打开了两个文件,一个文件描述符为name[0],另一个为name[1];若要往该管道中写入数据,应该关闭name[0];往name[1]中写数据;要从管道读取数据,关闭name[1];从name[0]中读取即可

    

2 有名管道函数

                int  mkfifo (const char *path, mode_t mode)

1):表头文件 sys/types.h; sys/stat.h。

2):mode模式。同文件的创建模式。

3):若成功则返回0,否则返回-1。

3 :信号通信

简介:信号通信是unix系统最为古老的通信方式。能产生信号的方法有硬件和

软件两种。硬件诸如:按键,除数为0,访问无效存储空间等。软件产生的信号主要是通过命令或函数。

软件产生信号的方法,最重要的是kill函数和kill命令。另外还有raise函数,alarm函数。

信号的种类非常繁多,并且都是以宏定义的形式呈现,都是一些整形常量。常见的信号:SIGKILL(该信号结束接收该信号的进程),SIGINT(来自键盘的中断信号ctrl+c),SIGSTOP(来自键盘ctrl+z或者调试程序的停止执行信号)。

kill函数:  int kill(pid_t pid , int signo)。

raise函数   int raise(int signo)。

Alarm函数   int alarm(unsigned int seconds)。该函数在设定时间后,产生一个SIGALARM信号,如果不捕捉该信号,则默认动作是终止该进程。

pause函数。 Int pause(void)。该函数使调用进程挂起,直至捕捉到一个信号。

信号的处理。调用函数signal。原型不容易理解,直接给出一个例子:

signal(SIGINT, my_func); 此处的myfunc函数时自己定义的一个处理SIGINT信号函数。

4:消息队列通信

简介:unix古老的两种通信方式信号通信和管道通信都有其缺陷。信号通信传输

的信息量有限,而管道通信则只能传送无格式的字节流。消息队列则则克服了上面的缺陷。

头文件:#include <sys/types.h>

       #include <sys/ipc.h>

  应用举例:首先定义一个数据结构,第一个成员必须是整形,或者长整形。它的作用是把信息做一个标识。写进去的信息如果是用100表示,那么读的时候也必须带上参数100,才能从消息队列中读出这条信息。

struct msg_buf

    {

       int mtype;

       char data[255];

};

key_t ftok(char *pathname , char pro); pro只要不为0即可

msgid=msgget(key,IPC_CREAT|0666);

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);

ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),mtype值,IPC_NOWAIT)

5:信号量

简介:与其它的通信方式不同,信号量主要是用于保护临界资源。进程可以根据它判定是否能够访问某些共享资源。

分类:二值信号灯和计数信号灯。

6:共享内存

产生共享内存:      shm_id=shmget(键值, 大小,读写权限) ;    为了防止输入的具体键值可能已经被占用,可以使用宏IPC_PRIVATE。来重新新建一块共享内存,它会自动使用新的键值。键值通常用IPC_PRIVATE. 读写权限用S_IRUSR|S_IWUSR

映射共享内存: 一个具体的例子:

                    c_addr = shmat(shmid,0,0);

其中shmid是由shmget得到的,第二个0,表示映射到应用程序的共享内存的起始位置。第三个参数不是很明白。

第100章、WebView应用之Javascript调用Android(从零开始学Android)

在某些Android应用中,使用Javascript调用Android中的方法也是会用到的。   (1)用WebView来显示HTML代码;   (2)允许WebView执行JavaScript ...
  • jianghuiquan
  • jianghuiquan
  • 2013年03月18日 14:37
  • 3488

C# 系统应用之鼠标模拟技术及自动操作鼠标

游戏程序的操作不外乎两种——键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合Fi...
  • Eastmount
  • Eastmount
  • 2014年10月13日 20:04
  • 5809

栈的应用——表达式求值

栈的应用——表达式求值  栈在数据结构中应用非常广泛,表达式求值就是最典型的例子之一。 1、        “表达式”  =  “第一操作数”  +  “运算符”  +  “第二操作数”   ...
  • K_zer0
  • K_zer0
  • 2017年02月07日 14:37
  • 241

机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾

Kaggle上的大神们,也分享过一些experience,说几条我记得的哈: 『对数据的认识太重要了!』 『数据中的特殊点/离群点的分析和处理太重要了!』 『特征工程(feature enginee...
  • longxinchen_ml
  • longxinchen_ml
  • 2015年11月12日 13:52
  • 10601

【转】C# 系统应用之使用Pancel控件同一窗体切换页面

时间 2014-03-18 15:57:49  CSDN博客原文  http://blog.csdn.net/eastmount/article/details/21461275 该文章...
  • zjwen2007
  • zjwen2007
  • 2014年11月12日 19:36
  • 365

树控件 加载磁盘文件/某一目录 层次显示所有文件的实现

一、目的:熟悉在树控件上的相关操作。在用户指定加载某个目录或者磁盘后,可以通过层级结构显示该目录或磁盘下的所有文件,以及文件对应的系统图标,在用户双击摸个文件或者文件夹后可以调用对应的程序打开文件、文...
  • baijiaheizhiganmao
  • baijiaheizhiganmao
  • 2013年11月18日 13:40
  • 2564

linux应用之线程编程

linux应用之线程编程 线程概述     进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。 ...
  • xfcy1990
  • xfcy1990
  • 2016年05月18日 23:24
  • 117

队的应用之基数排序

基数排序:       我的理解:其实就是对数组的每个元素,从个位开始进桶排序,再十位进桶排序.......。给图解释吧! 看这图理解会更好理解一点。 看看代码吧! #in...
  • qq_35256722
  • qq_35256722
  • 2016年09月29日 17:37
  • 83

Makefile应用之编译

一、初识Makefile http://www.cnblogs.com/huochangjun/archive/2012/08/31/makefile.html 用个简单的例子初步认识下mak...
  • tangchenchan
  • tangchenchan
  • 2015年04月09日 10:49
  • 307

Windows7应用之端口

今天在学习计算机网络之后尝试了一下telnet,也就把windows的各个端口的功能查了一下。供以后参考使用。常用端口介绍:21端口:21端口主要用于FTP(File Transfer Protoco...
  • loonghun
  • loonghun
  • 2013年11月01日 18:48
  • 488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux应用之----进程通信
举报原因:
原因补充:

(最多只允许输入30个字)