- 浏览: 1926931 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
cht的大摩托:
学习
IBM WebSphere Performance Tool / ISA / jca457.jar / ha456.jar / ga439.jar -
leeking888:
有没有linux 64位的相关librfccm.so等包啊?
web test LoadRunner SAP / java / Java Vuser / web_set_max_html_param_len -
paladin1988:
非常不错,多谢了。。
appServer IBM WebSphere / WAS 7 / 8.5 / was commerce -
hzxlb910:
写了这么多
net TCP/IP / TIME_WAIT / tcpip / iperf / cain -
acwyg:
ed2k://|file|LoadRunner.V8.1.is ...
web test performance tools / linux performance tools / windows performance tools
reference:
http://www.3800hk.com/news/w32/12825.html
http://jsjjx.hxu.edu.cn/os/zy/fy1/OSppt_02.files/frame.htm
http://www.diybl.com/course/6_system/linux/Linuxjs/2007930/75458.html
http://blog.csdn.net/hgf_006/archive/2007/12/10/1928395.aspx
http://v.youku.com/v_show/id_XMjU1OTA1Mg==.html
http://www.examda.com/zikao/praxis/Gongxue/02335/115914930.html
http://ygw365.bokee.com/viewdiary.16339059.html
key words
RPC Remote Procedure Call Protocol 远程调用协议
IPC信息技术有限公司,总部设于新加坡,信息技术公司
[UNIX] 进程间通讯 Internet Process Connection
计算机专业
= Industrial Process Control,工业过程控制
= Information Processing Center, 信息[情报]处理中心
= Information Processing Code, 信息处理代码
= Initial Phase Correction, 初始相位校正
= Integrated Peripheral Channel, 集成外围通道
http://baike.baidu.com/view/32726.htm
对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同
前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;
后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制,(socket本身就可以用于单机内的进程间通信)
最初Unix IPC包括:管道、FIFO、信号
System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;
Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。
共享内存来说,有Posix共享内存区以及System V共享内存区两个实现版本
Windows系统中进程之间的通信方式 RPC Remote Procedure Call
windows里VB和VC的两个程序通讯,就是用内存映射、消息、pipe,当然还有socket
linux和windows编译器用到的库不同,具体函数在实现上可能有不同,但是理论上是相同的
UNIX 操作系统中进程之间调用的通信方式
1,管道 pipe 和 命名管道 named pipe
2,信号量
, semaphore
3,消息队列 FIFO
First Input First Output,先入先出队列 \报文队列
MQ Message queue
4,共享内存 shared memory
5,socket通讯
一般情况下,流是通过unix socket实现的,
linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的
linux下进程间通信的几种主要手段简介
管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
信号(Signal): 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;
报文(Message)队列(消息队列):
消息队列是消息的链接表,包括Posix消息队列system V消息队列,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore): 主要作为进程间以及同一进程不同线程之间的同步手段。
套接口(Socket): 更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
一般来说,linux下的进程包含以下几个关键要素:
有一段可执行程序;
有专用的系统堆栈空间;
内核中有它的控制块(进程控制块),描述进程所占用的资源,这样,进程才能接受内核的调度;
具有独立的存储空间
进程和线程有时候并不完全区分,而往往根据上下文理解其含义。
参考文献:
UNIX环境高级编程
,作者:W.Richard Stevens,译者:尤晋元等,机械工业出版社。具有丰富的编程
实例,以及关键函数伴随Unix的发展历程。
linux内核源代码情景分析(上、下),毛德操、胡希明著,浙江大学出版社,提供了对linux内核非常好的分析,同时,对一些关键概念的背景进行了详细的说明。
UNIX网络
编程
第二卷:进程间通信,作者:W.Richard Stevens,译者:杨继张,清华大学出版社。一本比较全面阐述Unix环境下进程间通信的书(没有信号和套接口,套接口在第一卷中)。
----------------------------------------------------------------------------------------------------------------------------------
Linux进程间通信 http://www.diybl.com/course/6_system/linux/Linuxjs/2007930/75458.html
Linux环境进程间通信 ——无名管道工作机制研究
一、引言
Linux作为一个开源的操作系统,是我们进行操作系统和提高编程水平的最佳途径之一。
好的程序如同好的音乐一样,完成的完美、巧妙。开放源码的程序都是经过无数人检验地,本文将以linux-kernel-2.6.5为例对pipe的工作机制进行阐述。
二、进程间通信的分类
大型程序大多会涉及到某种形式的进程间通信,一个较大型的应用程序设计成可以相互通信的“碎片”,从而就把一个任务分到多个进程中去。进程间通信的方法有三种方式:
管道(pipe)
套接字(socket)
System v IPC 机制
管道机制在UNIX开发的早期就已经提供了,它在本机上的两个进程间的数据传递表现的相当出色;套接字是在BSD(Berkeley Software Development)中出现的,现在的应用也相当的广泛;而System V IPC机制Unix System V 版本中出现的。
三、工作机制
管道分为pipe(无名管道)和FIFO( 命名管道),它们都是通过内核缓冲区按先进先出的方式数据传输,管道一端顺序地写入数据,另一端顺序地读入数据读写的位置都是自动增加,数据只读一次,之后就被释放。在缓冲区写满时,则由相应的规则控制读写进程进入等待队列,当空的缓冲区有写入数据或满的缓冲区有数据读出时,就唤醒等待队列中的写进程继续读写。
管道的读写规则:
管道两端可分别用描述字fd[0]以及fd[1]来描述,需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。
四、pipe的数据结构
首先要定义一个文件系统类型:pipe_fs_type。
fs/pipe.c static struct file_system_type pipe_fs_type = { .name = "pipefs", .get_sb = pipefs_get_sb, .kill_sb = kill_anon_super, };
变量pipe_fs_type其类型是 struct file_system_type 用于向系统注册文件系统。
Pipe以类似文件的方式与进程交互,但在磁盘上无对应节点,因此效率较高。Pipe主要包括一个inode和两个file结构——分别用于读和写。Pipe的缓冲区首地址就存放在inode的i_pipe域指向pipe_inode_info结构中。但是要注意pipe的inode并没有磁盘上的映象,只在内存中交换数据。
static struct super_block *pipefs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC); }
上为超级的生成函数。
Include/linux/pipe.h #ifndef _LINUX_PIPE_FS_I_H #define _LINUX_PIPE_FS_I_H #define PIPEFS_MAGIC 0x50495045 struct pipe_inode_info { wait_queue_head_t wait; 1 char *base; 2 unsigned int len; 3 unsigned int start; 4 unsigned int readers; 5 unsigned int writers; 6 unsigned int waiting_writers; 7 unsigned int r_counter; 8 unsigned int w_counter; 9 struct fasync_struct *fasync_readers; 10 struct fasync_struct *fasync_writers; 11 };
2 管道等待队列指针wait
3 内核缓冲区基地址base
4 缓冲区当前数据量
6 管道的读者数据量
7 管道的写者数据量
8 等待队列的读者个数
9 等待队列的写者个数
11、12 主要对 FIFO
五、管道的创建:
通过pipe系统调用来创建管道。
int do_pipe(int *fd) { struct qstr this; char name[32]; struct dentry *dentry; struct inode * inode; struct file *f1, *f2; int error; int i,j; error = -ENFILE; f1 = get_empty_filp(); //分配文件对象,得到文件对象指针用于读管道 if (!f1) goto no_files; f2 = get_empty_filp(); //分配文件对象,得到文件对象指针用于读管道 if (!f2) goto close_f1; inode = get_pipe_inode(); //调用get_pipe_inode获得管道类型的索引节点 if (!inode) 的指针inode。 goto close_f12; error = get_unused_fd(); //获得当前进程的两个文件描述符。在当前的 if (error < 0) 进程的进程描述符file域中,有一个fd 域, goto close_f12_inode; //指向该进程当前打开文件指针数组,数组 i=error; 元素是指向文件对象的指针。 error = get_unused_fd(); if (error < 0) goto close_f12_inode_i; j = error; error = -ENOMEM; sprintf(name, "[%lu]", inode->i_ino); //生成对象目录dentry, this.name = name; 并通过它将上述两个文 this.len = strlen(name); 件对象将的指针与管道 this.hash = inode->i_ino; /* will go */ 索引节点连接起来。 dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this); if (!dentry) goto close_f12_inode_i_j; dentry->d_op = &pipefs_dentry_operations; d_add(dentry, inode); f1->f_vfsmnt = f2->f_vfsmnt = mntget(mntget(pipe_mnt)); f1->f_dentry = f2->f_dentry = dget(dentry); f1->f_mapping = f2->f_mapping = inode->i_mapping; /* read file */ f1->f_pos = f2->f_pos = 0; //为用于读的两个文件对象设置属性值 f1->f_flags = O_RDONLY; f_flage设置为只读,f_op设置为 f1->f_op = &read_pipe_fops; read_pipe_fops 结构的地址。 f1->f_mode = 1; f1->f_version = 0; /* write file */ //为用于写的两个文件对象设置属性值 f2->f_flags = O_WRONLY; f_flage设置为只写,f_op设置为 write_pipe_fops 结构的地址。 f2->f_op = &write_pipe_fops; f2->f_mode = 2; f2->f_version = 0; fd_install(i, f1); fd_install(j, f2); fd[0] = i; //将两个文件描述符放入参数fd数组返回 fd[1] = j; return 0; close_f12_inode_i_j: put_unused_fd(j); close_f12_inode_i: put_unused_fd(i); close_f12_inode: free_page((unsigned long) PIPE_BASE(*inode)); kfree(inode->i_pipe); inode->i_pipe = NULL; iput(inode); close_f12: put_filp(f2); close_f1: put_filp(f1); no_files: return error; }
六、管道的释放
管道释放时f-op的release域在读管道和写管道中分别指向pipe_read_release()和pipe_write_release()。而这两个函数都调用release(),并决定是否释放pipe的内存页面或唤醒该管道等待队列的进程。
以下为管道释放的代码:
static int pipe_release(struct inode *inode, int decr, int decw) { down(PIPE_SEM(*inode)); PIPE_READERS(*inode) -= decr; PIPE_WRITERS(*inode) -= decw; if (!PIPE_READERS(*inode) && !PIPE_WRITERS(*inode)) { struct pipe_inode_info *info = inode->i_pipe; inode->i_pipe = NULL; free_page((unsigned long) info->base); kfree(info); } else { wake_up_interruptible(PIPE_WAIT(*inode)); kill_fasync(PIPE_FASYNC_READERS(*inode), SIGIO, POLL_IN); kill_fasync(PIPE_FASYNC_WRITERS(*inode), SIGIO, POLL_OUT); } up(PIPE_SEM(*inode)); return 0;}
七、管道的读写
1.从管道中读取数据:
如果管道的写端不存在,则认为已经读到了数据的末尾,读函数返回的读出字节数为0;
当管道的写端存在时,如果请求的字节数目大于PIPE_BUF,则返回管道中现有的数据字节数,如果请求的字节数目不大于PIPE_BUF,则返回管道中现有数据字节数(此时,管道中数据量小于请求的数据量);或者返回请求的字节数(此时,管道中数据量不小于请求的数据量)。
2.向管道中写入数据:
向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
八、管道的局限性
管道的主要局限性正体现在它的特点上:
l 只支持单向数据流;
l 只能用于具有亲缘关系的进程之间;
l 没有名字;
l 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);
l 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等。
九、后记
写完本文之后,发现有部分不足之处。在由于管道读写的代码过于冗长,限于篇幅不一一列出。有不足和错误之处还请各位老师指正。通过一段时间对Linux的内核代码的学习,开源的程序往往并非由“权威人士”、“享誉海内外的专家”所编写,它们的由一个个普通的程序员写就。但专业造就专家,长时间集中在某个领域中能够创建出据程序员应该珍视的财富。
----------------------------------------------------------------------------------------------------------------------------------
reference:http://blog.csdn.net/hgf_006/archive/2007/12/10/1928395.aspx
windows下进程通信方式
摘
要
随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/
多线程程序成为现代程序设计的一个重要特点,在多进程程序设计中,进程间的通信是不可避免的。Microsoft Win32 API
提供了多种进程间通信的方法,全面地阐述了这些方法的特点,并加以比较和分析,希望能给读者选择通信方法提供参考。
关键词
进程
进程通信 IPC Win32 API
1 进程与进程通信
进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(
如文件、管道等)
组成。多进程/
多线程是Windows
操作系统的一个基本特征。Microsoft Win32
应用编程接口(Application Programming Interface, API)
提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC)
,进程通信就是指不同进程间进行数据共享和数据交换。
正因为使用Win32 API
进行进程通信方式有多种,如何选择恰当的通信方式就成为应用开发中的一个重要问题,下面本文将对Win32
中进程通信的几种方法加以分析和比较。
2 进程通信方法
2.1
文件映射
文件映射(Memory-Mapped Files)
能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O
操作,只需简单的指针操作就可读取和修改文件的内容。
Win32 API
允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
应用程序有三种方法来使多个进程共享一个文件映射对象。
(1)
继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
(2)
命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(
可与文件名不同)
。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC
机制(
有名管道、邮件槽等)
把名字传给第二个进程。
(3)
句柄复制:第一个进程建立文件映射对象,然后通过其它IPC
机制(
有名管道、邮件槽等)
把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。
2.2
共享内存
Win32 API
中共享内存(Shared Memory)
实际就是文件映射的一种特殊情况。进程在创建文件映射对象时用0xFFFFFFFF
来代替文件句柄(HANDLE)
,就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用文件映射实现的,所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。
2.3
匿名管道
管道(Pipe)
是一种具有两个端点的通信通道:有一端句柄的进程可以和有另一端句柄的进程通信。管道可以是单向-一端是只读的,另一端点是只写的;也可以是双向的一管道的两端点既可读也可写。
匿名管道(Anonymous Pipe)
是
在父进程和子进程之间
,或同一父进程的两个子进程
之间传输数据的无名字的单向管道。通常由父进程创建管道,然后由要通信的子进程继承通道的读端点句柄或写
端点句柄,然后实现通信。父进程还可以建立两个或更多个继承匿名管道读和写句柄的子进程。这些子进程可以使用管道直接通信,不需要通过父进程。
匿名管道是单机上实现子进程标准I/O
重定向的有效方法,它不能在网上使用,也不能用于两个不相关的进程之间。
2.4
命名管道
命名管道(Named Pipe)
是服务器进程和一个或多个客户进程之间通信的单向或双向管道。不同于匿名管道的是命名管道可以在不相关的进程之间和不同计算机之间使用,服务器建立命名管道时给它指定一个名字,任何进程都可以通过该名字打开管道的另一端,根据给定的权限和服务器进程通信。
命名管道提供了相对简单的编程接口,使通过网络传输数据并不比同一计算机上两进程之间通信更困难,不过如果要同时和多个进程通信它就力不从心了。
2.5
邮件槽
邮件槽(Mailslots)
提
供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程,称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消
息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户
,因此可建立多个
邮件槽实现进程间的双向
通信。
通过邮件槽可以给本地计算机上的邮件槽、其它计算机上的邮件槽或指定网络区域中所有计算机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超过400
字节,非广播消息的长度则受邮件槽服务器指定的最大消息长度的限制。
邮件槽与命名管道相似,不过它传输数据是通过不可靠的数据报(
如TCP/IP
协议中的UDP
包)
完成的,一旦网络发生错误则无法保证消息正确地接收,而命名管道传输数据则是建立在可靠连接基础上的。不过邮件槽有简化的编程接口和给指定网络区域内的所有计算机广播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一种选择。
2.6
剪贴板
剪贴板(Clipped Board)
实质是Win32 API
中一组用来传输数据的函数和消息,为Windows
应用程序之间进行数据共享提供了一个中介,Windows
已建立的剪切(
复制)
-粘贴的机制为不同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时,应用程序把选取的数据用一种或多种格式放在剪贴板上。然后任何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式。
剪贴板是一个非常松散的交换媒介,可以支持任何数据格式,每一格式由一无符号整数标识,对标准(
预定义)
剪贴板格式,该值是Win32 API
定义的常量;对非标准格式可以使用Register Clipboard Format
函数注册为新的剪贴板格式。利用剪贴板进行交换的数据只需在数据格式上一致或都可以转化为某种格式就行。但剪贴板只能在基于Windows
的程序中使用,不能在网络上使用。
2.7
动态数据交换
动态数据交换(DDE)
是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE
进行一次性数据传输,也可以当出现新数据时,通过发送更新值在应用程序间动态交换数据。
DDE
和剪贴板一样既支持标准数据格式(
如文本、位图等)
,又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答-如从菜单中选择Paste
命令。尽管DDE
也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。DDE
有三种数据交换方式:
(1)
冷链:数据交换是一次性数据传输,与剪贴板相同。
(2)
温链:当数据交换时服务器通知客户,然后客户必须请求新的数据。
(3)
热链:当数据交换时服务器自动给客户发送数据。
DDE
交换可以发生在单机或网络中不同计算机的应用程序之间。开发者还可以定义定制的DDE
数据格式进行应用程序之间特别目的IPC
,它们有更紧密耦合的通信要求。大多数基于Windows
的应用程序都支持DDE
。
2.8
对象连接与嵌入
应用程序利用对象连接与嵌入(OLE)
技术管理复合文档(
由多种数据格式组成的文档)
,OLE
提供使某应用程序更容易调用其它应用程序进行数据编辑的服务。例如,OLE
支持的字处理器可以嵌套电子表格,当用户要编辑电子表格时OLE
库可自动启动电子表格编辑器。当用户退出电子表格编辑器时,该表格已在原始字处理器文档中得到更新。在这里电子表格编辑器变成了字处理器的扩展,而如果使用DDE
,用户要显式地启动电子表格编辑器。
同DDE
技术相同,大多数基于Windows
的应用程序都支持OLE
技术。
2.9
动态连接库
Win32
动态连接库(DLL)
中的全局数据可以被调用DLL
的所有进程共享,这就又给进程间通信开辟了一条新的途径,当然访问时要注意同步问题。
虽然可以通过DLL
进行进程间数据共享,但从数据安全的角度考虑,我们并不提倡这种方法,使用带有访问权限控制的共享内存
的方法更好
一些。
2.10
远程过程调用
Win32 API
提供的远程过程调用(RPC)
使应用程序可以使用远程调用函数,这使在网络上用RPC
进行进程通信就像函数调用那样简单。RPC
既可以在单机不同进程间使用也可以在网络中使用。
由于Win32 API
提供的RPC
服从OSF-DCE(Open Software Foundation Distributed Computing Environment)
标准。所以通过Win32 API
编写的RPC
应用程序能与其它操作系统上支持DEC
的RPC
应用程序通信。使用RPC
开发者可以建立高性能、紧密耦合的分布式应用程序。
2.11 NetBios
函数
Win32 API
提供NetBios
函数用于处理低级网络控制,这主要是为IBM NetBios
系统编写与Windows
的接口。除非那些有特殊低级网络功能要求的应用程序,其它应用程序最好不要使用NetBios
函数来进行进程间通信。
2.12 Sockets
Windows Sockets
规范是以U.C.Berkeley
大学BSD UNIX
中流行的Socket
接口为范例定义的一套Windows
下的网络编程接口。除了Berkeley Socket
原有的库函数以外,还扩展了一组针对Windows
的函数,使程序员可以充分利用Windows
的消息机制进行编程。
现在通过Sockets
实现进程通信的网络应用越来越多,这主要的原因是Sockets
的跨平台性要比其它IPC
机制好得多,另外WinSock 2.0
不仅支持TCP/IP
协议,而且还支持其它协议(
如IPX)
。Sockets
的唯一缺点是它支持的是底层通信操作,这使得在单机的进程间进行简单数据传递不太方便,这时使用下面将介绍的WM_COPYDATA
消息将更合适些。
2.13 WM_COPYDATA
消息
WM_COPYDATA
是一种非常强大却鲜为人知的消息。当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage
函数,参数是目的窗口的句柄、传递数据的起始地址、WM_COPYDATA
消息。接收方只需像处理其它消息那样处理WM_COPY DATA
消息,这样收发双方就实现了数据共享。
WM_COPYDATA
是一种非常简单的方法,它在底层实际上是通过文件映射
来实现的。它的缺点是灵活性不高,并且它只能用于Windows
平台的单机环境
下。
3 结束语
Win32 API
为应用程序实现进程间通信提供了如此多种选择方案,那么开发者如何进行选择呢?通常在决定使用哪种IPC
方法之前应考虑以下一些问题:
(1)
应用程序是在网络环境下还是在单机环境下工作。
发表评论
-
OS + Linux RedHat 7 / redhat 7 configuration
2017-05-27 16:14 840s redhat 7.2 tracker-store C ... -
OS + Linux CoreOS / Ubuntu 16.04 LTS / docker / openSTF
2016-10-18 09:45 1656s DOCKER windows安装 http://b ... -
OS + Linux Framework GUI wxWidgets / QT / GTK / Windows MFC、WTL、WPF、MAC Cocoa
2016-08-03 14:20 962s MFC、WTL、WPF、wxWidget ... -
OS + Linux Shell Command find
2013-03-22 15:24 2729Linux中find常见用法示例 http://w ... -
OS + Linux Kernel IO PPC / TPC / select / poll / ppoll / epoll
2013-02-05 14:20 1697Using epoll() For Asynchro ... -
OS + Unix FreeBSD / MacOSX Snow Leopard 10.6.3 / 10.6.7 / 10.6.8 v1.1
2012-10-30 11:16 14764http://support.apple.com/zh_C ... -
OS + UNIX AIX /etc/services
2012-04-13 20:02 17211$ cat /etc/services # @(# ... -
OS + Linux Shell Sed / Linux Sed / linux Sed / Linux sed / linux sed / sed
2012-02-28 17:04 2376linux shell 之 sed [ftpus ... -
OS + UNIX AIX Tools
2011-11-23 16:51 1142许多 UNIX 管理员都拥 ... -
OS + UNIX AIX performance
2011-11-23 16:48 1924十大AIX高手巅峰对决 银行业再度包揽前三 2013-02 ... -
OS + UNIX AIX command
2011-11-23 16:18 3377AIX版必读收藏贴 http://www.loveu ... -
OS + Linux/Unix download tools curl / wget
2011-11-01 15:05 2482s 用wget下载整个网站 http://zha ... -
OS + Linux RedHat Autotools aclocal / autoscan / autoconf / autoheader /automake
2011-09-15 16:27 1868Auto Tools使用流程 htt ... -
OS + Linux DNS Server Bind
2011-08-16 17:36 1278[root@B2Cmonitor Server]# ps -e ... -
OS + Unix IBM Aix basic / topas / nmon / filemon / vmstat / iostat / sysstat/sar
2011-07-15 23:43 9739nmon 性能:分析 AIX 和 Linux 性能的免 ... -
Unix + OS books
2011-05-01 15:21 2139linux下fork的运行机制 http://www.c ... -
RedHat + OS CPU、MEM、DISK
2011-03-08 15:28 1510RedHat 批量查看Linux机器磁盘空间 [ro ... -
OS + Linux File nfs / samba / rsync / inotify / smb / webdav
2011-01-18 16:00 7686Linux NFS 和 Samba 共享配置 http: ... -
OS + Linux Disk disk lvm / disk partition / disk mount / disk io
2010-12-29 11:35 3266RedHat Linux LVM LVM - ... -
Unix + OS IBM Aix Disk disk lvm / disk partition / disk mount / disk mon / File
2010-12-28 17:59 4521AIX file AIX 5L 上JF ...
相关推荐
- **内容**:包括系统调用、进程间通信(IPC)、文件I/O操作等。 - **资源**:推荐《UNIX环境高级编程》等书籍。 **2. 驱动开发** - **目标**:掌握设备驱动开发流程和技术。 - **内容**:了解字符设备、块设备、...
《深入浅出Linux环境编程》配套资料主要涵盖了四个核心领域:进程基础、IPC(Inter-Process Communication,进程间通信)、POSIX标准以及线程同步与互斥。这些内容是理解和开发Linux系统应用的基础,让我们逐一深入...
3. **进程和线程**:理解进程间通信(IPC)机制,如管道、信号量、消息队列、共享内存等,并学会在多线程环境中同步和互斥。 4. **网络编程**:利用套接字API进行TCP/IP通信,实现客户端-服务器模型,理解和处理...
在Linux操作系统中,IPC(Inter-Process Communication,进程间通信)是多个进程间进行数据交换和协调工作的重要机制。这个名为“ipc.rar”的压缩包包含了关于IPC在Linux环境下的实践案例,主要使用C语言实现。下面...
在提供的压缩包“LinuxIPC问题”中,可能包含了示例代码和讲解,你可以通过解压文件来深入学习这些概念并了解它们在实际应用中的用法。通过理解和实践这些IPC机制,你可以更有效地在Linux环境中解决进程间通信的问题...
在Linux操作系统中,Interprocess Communication(IPC)是进程间通信的一种机制,允许不同的进程之间交换数据。本篇文章将深入探讨Linux IPC技术,并着重讲解如何在实际应用中使用`ftok`函数以及与消息队列相关的...
### 深入理解Linux内核IPC机制 #### 一、引言 随着现代计算技术的飞速发展,操作系统作为连接硬件与应用软件的关键层,其内部机制的重要性日益凸显。在众多操作系统中,Linux以其开源性和灵活性而广受欢迎。Linux...
6. **进程与线程**:学习如何创建和管理进程,理解进程间通信(IPC)机制,以及线程的创建和同步。 7. **文件系统**:了解Linux的目录结构和文件系统,如何进行文件的创建、删除、重命名等操作。 8. **编译与调试*...
你还将学习到进程间通信(IPC),如管道、信号量、共享内存等,这些都是构建多进程应用程序的基础。 除了理论知识,资料中的代码示例将让你有机会实践所学。通过实际编写、运行和调试代码,可以加深对概念的理解,...
"Linux系统中IPC机制的分析与实现.pdf" 本文主要讨论了Linux系统中的IPC(Inter-Process Communication,进程间通信)机制,包括信号、管道、共享内存、信号量、消息队列、套接字等。这些机制都是Linux系统中实现...
在Linux操作系统中,IPC(Inter-Process Communication,进程间通信)是多个进程之间共享数据、交换信息的一种机制。它是实现并发程序协作的关键技术,通过不同的IPC方式,进程可以有效地协调工作,实现同步、互斥...
标题中的“ipc.rar_IPC_linux i_linux ipc”表明这是一个关于Linux内核源代码中IPC实现的资源集合。在这个压缩包中,我们有两个文件:www.pudn.com.txt和ipc,它们可能包含相关的文档或代码示例。 Linux IPC主要...
6种进程间通信
在Linux操作系统中,Interprocess Communication (IPC) 是一种机制,允许不同进程间交换数据和进行同步。本资源集合提供了一套通用的IPC方法,适用于多种情况,有助于提高代码的复用性和开发效率。以下是关于这些...
在Linux系统中,进行IPC(Internet Protocol Camera,网络摄像机)的二次开发是为了解决特定场景下的监控需求,如定制化功能、优化性能或整合到现有系统中。本资源包"Linux下IPC二次开发文档.zip"正是针对这一目标...
5. **进程和线程**:书中详细介绍了进程和线程的概念,包括进程创建、进程间通信(IPC)、线程同步和互斥等,这对于编写多任务、多线程的程序至关重要。 6. **网络编程**:Linux环境下的网络编程是其一大特色,书中...
在Linux环境中,Perl是一种强大的脚本编程语言,广泛用于系统管理、网络编程和文本处理等任务。`IPC::Cmd`是Perl的一个模块,...遵循这些步骤,你就能在没有网络连接的Linux系统上成功安装并使用`perl-IPC-Cmd`模块了。
"嵌入式Linux应用程序开发详解"这部分可能涵盖C/C++编程、系统调用、进程间通信(IPC)、线程管理、文件系统操作等内容。开发者需要学会如何在Linux环境下编写可移植性良好的程序,同时理解和运用标准的Linux API。...
在Linux下,进程间通信(IPC)如管道、信号量、共享内存也是常见的编程需求。 5. **系统调用**:C语言可以直接调用Linux内核提供的系统调用,如open、read、write、close等进行I/O操作,或者socket、bind、listen、...