搜档网
当前位置:搜档网 › linux进程间通讯的几种方式

linux进程间通讯的几种方式

linux进程间通讯的几种方式
linux进程间通讯的几种方式

1.信号:(signal)是一种处理异步事件的方式。信号时比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。

2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

linux进程间通讯的几种方式的特点和优缺点,和适用场合

1.

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

共享内存( shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

套接字( socket ) :套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

管道的主要局限性正体现在它的特点上:

只支持单向数据流;

只能用于具有亲缘关系的进程之间;

没有名字;

管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);

管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等;

2.

用于进程间通讯(IPC)的四种不同技术:

1. 消息传递(管道,FIFO,posix和system v消息队列)

2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯)

3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区)

4. 过程调用(Solaris门,Sun RPC)

消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区通常需要由应用程序提供的某种同步形式才能正常工作.解决某个特定问题应使用哪种IPC,不存在简单的判定,应该逐渐熟悉各种IPC形式提供的机制,然后根据特定应用的要求比较它们的特性.

必须考虑的四个前提:

1. 联网的还是非联网的.IPC适用于单台主机上的进程或线程间的.如果应用程序有可能分布到多台主机上,那就要考虑使用套接字代替IPC,从而简化以后向联网的应用程序转移的工作.

2. 可移植性.

3. 性能,在具体的开发环境下运行测试程序,比较几种IPC的性能差异.

4. 实时调度.如果需要这一特性,而且所用的系统也支持posix实时调度选项,那就考虑使用Posix的消息传递和同步函数.

各种IPC之间的一些主要差异:

1. 管道和FIFO是字节流,没有消息边界.

Posix消息和System V消息则有从发送者向接受者维护的记录边界

(eg:TCP是没有记录边界的字节流,UDP则提供具有记录边界的消息).

2. 当有一个消息放置到一个空队列中时,Posix消息队列可向一个进程发送一个信号,或者启动一个新的线程.System V则不提供类似的通知形式.

3. 管道和FIFO的数据字节是先进先出的.Posix消息和System V消息具有由发送者赋予的优先级.从一个Posix消息队列读出时,首先返回的总是优先级最高的消息.从一个System V消息队列读出时,读出者可以要求想要的任意优先级的消息.

4. 在众多的消息传递技术—管道,FIFO,Posix消息队列和System V消息队列—中,可从一个信号处理程序中调用的函数只有read和write(适用于管道和FIFO).

比较不同形式的消息传递时,我们感兴趣的有两种测量尺度:

1.带宽(bandwidth):数据通过IPC通道转移的速度.为测量该值,我们从一个进程向另一个进程发送大量数据(几百万字节).我们还给不同大小的I/O操作(例如管道和FIFO的write和read操作)测量该值,期待发现带宽随每个I/O操作的数据量的增长而增长的规律.

2. 延迟(latency):一个小的IPC消息从一个进程到令一个进程再返回来所花的时间.我们测量的是只有一个1个字节的消息从一个进程到令一个进程再回来的时间(往返时间)

在现实世界中,带宽告诉我们大块数据通过一个IPC通道发送出去需花多长时间,然而IPC也用于传递小的控制信息,系统处理这些小消息所需的时间就由延迟提供.这两个数都很重要.

3.

进程间数据通信方式和特点(转)

2010-09-03 18:29

由于不同进程运行在各自不同内存空间中.一方对于变量的修改另一方是无法感知的.因此.进程之间的信息传递不可能通过变量或其它数据结构直接进行,只能通过进程间通信来完成。

根据进程通信时信息量大小的不同,可以将进程通信划分为两大类型:控制信息的通信和大批数据信息的通信.前者称为低级通信,后者称为高级通信。

低级通信主要用于进程之间的同步、互斥、终止、挂起等等控制信息的传递。

高级通信主要用于进程间数据块的交换和共享常见的高级通信有管道(PIPE)、消息队列(MESSAGE)、共享内存(SHARED MEM0RY)等。

这里主要比较一下高级通信的这三种方式的特点。

管道通信(PIPE)

两个进程利用管道进行通信时.发送信息的进程称为写进程.接收信息的进程称为读进程。管道通信方式的中间介质就是文件.通常称这种文件为管道文件.它就像管道一样将一个写进程和一个读进程连接在一起,实现两个进程之间的通信。写进程通过写入端(发送端)往管道文件中写入信息;读进程通过读出端(接收端)从管道文件中读取信息。两个进程协调不断地进行写和读,便会构成双方通过管道传递信息的流水线。

利用系统调用PIPE()可以创建一个无名管道文件,通常称为无名管道或PIPE;利用系统调用MKNOD()可以创建一个有名管道文件.通常称为有名管道或FIFO。无名管道是一种非永

久性的管道通信机构.当它访问的进程全部终止时,它也将随之被撤消。无名管道只能用在具有家族联系的进程之间。有名管道可以长期存在于系统之中.而且提供给任意关系的进程使用,但是使用不当容易导致出错.所以操作系统将命名管道的管理权交由系统来加以控制管道文件被创建后,可以通过系统调用WRITE()和READ()来实现对管道的读写操作;通信完后,可用CLOSE()将管道文件关闭。

消息缓冲通信(MESSAGE)

多个独立的进程之间可以通过消息缓冲机制来相互通信.这种通信的实现是

以消息缓冲区为中间介质.通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。消息队列一旦创建后即可由多进程共享.发送消息的进程可以在任意时刻发送任意个消息到指定的消息队列上,并检查是否有接收进程在等待它所发送的消息。若有则唤醒它:而接收消息的进程可以在需要消息的时候到指定的消息队列上获取消息.如果消息还没有到来.则转入睡眠状态等待。

共享内存通信(SHARED MEMORY)

针对消息缓冲需要占用CPU进行消息复制的缺点.OS提供了一种进程间直接进行数据交换的通信方式一共享内存顾名思义.这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段(作为中间介质)进行通信.它是一种最有效的数据通信方式,其特点是没有中间环节.直接将共享的内存页面通过附接.映射到相互通信的进程各自的虚拟地址空间中.从而使多个进程可以直接访问同一个物理内存页面.如同访问自己的私有空间一样(但实质上不是私有的而是共享的)。因此这种进程间通信方式是在同一个计算机系统中的诸进程间实现通信的最快捷的方法.而它的局限性也在于此.即共享内存的诸进程必须共处同一个计算机系统.有物理内存可以共享才行。

三种方式的特点(优缺点):

1.无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享:有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。

2.消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送和接收之间的同步.从而使得用

户在使用消息缓冲进行通信时不再需要考虑同步问题.使用方便,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。

3.共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。但是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的.因此,这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其他同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中的诸进程共享。不方便网络通信。

4.

代码行统计 ( Mon, 20 Apr 2009 13:24:09 +0800 )

Description:

#find . -name *.c |xargs wc -l

802 ./lcec/src/Slcec_conf.c

2380 ./lcec/src/Slcec_view.c

1435 ./lcec/src/Slcec_ctl.c

......

84876 total

指针和引用 ( Wed, 8 Apr 2009 16:18:29 +0800 )

Description:

int (*pa)[3];

int b[2][3];

pa=b;

pa是一个指向一个具有3个int型元素的一位数组的指针

如果不加括号,可以理解为int* pa[3];

-------------------

二级指针和指针数组:

char *week[]={"","Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; void main(int argc,char **argv){

cout<

}

void main(int argc,char *argv[ ])

-------------------

int sin(double x);

int (*pf)( );

pf=sin;

pf是一个指向返回值为int型值的函数的指针

如果不加括号,可以理解为int* pf( );

动态网页制作实训作业

实训任务(2011 春) 郭明 2011年02月22日文章浏览次数:54 责任教师联系方式:郭明:guom@https://www.sodocs.net/doc/7d9043378.html, 资料来源:北京广播电视大学 实训任务 实训一(ASP编程环境设置)任务书 【实训目的】 1.学会Windows 2000/NT服务器上IIS(Internet服务管理器)的安装与配置; 2.学会创建虚拟目录; 3.学会运行ASP程序 【建议学时】3课时 【项目类型】必做 【实训内容】 实训内容操作提示 在Windows平台上安装服务器软件IIS 在Windows 2000/NT或Windows XP 平台上安装。

【样张】 【实施环境及提供的材料】

1.能正常运行IIS服务器的计算机和操作系统 2.实训素材(与本任务书在同一目录中) 【拓展练习】 通过本实训的操练,同学具备了基本的操作能力,试着脱离指导步骤,独立安装服务器软件、熟练创建虚拟目录并正确运行ASP程序。 【思考题】 1.什么是IIS? 2.怎样安装和设置IIS? 3.是否一定要在 C:\Inetpub\wwwroot 下建立Web应用程序?可不可以放在别的文件夹下? 实训二(HTML标记的使用)任务书 【实训目的】 1.通过编写简单的网页文件,掌握HTML文档的基本结构; 2.掌握网页中图像、超链接、表格、表单等相关标记的使用,并能熟练应用这些标记进行网页设计; 3.了解网页设计中CSS样式的使用。 【建议学时】6课时

【项目类型】必做 【实训内容】 编写一个网页(扩展名为htm),设计如样图所示的表单。 操作提示: 1.打开记事本(或dreamweaver软件),建立html文档的基本结构; 2.使用表格(table标记)进行网页布局:使用表格嵌套,先建立一个3×1的表格,第一行插入图片,第二行嵌套一个11×2的表格,用于设计表单,第三行插入图片并建立 E_mail链接; 3.使用form标记设计表单; 4.使用img标记插入图片; 5.使用a标记建立超链接。 【样图】

Java多线程习题

Java 多线程习题 知识点: Java 的多线程,实现多线程的两种方法,线程控制、调度方法 一、选择题 1、什么原因可导致线程停止执行。 ( ) A. 线程调用了wait()方法; B. 线程调用了yield()方法; C. 线程调用了pause()方法; D. 线程调用了sleep() 方法。 2、哪个方法是实现Runnable 接口所需的? A. wait() B . run() C . stop() D . update() E . resume() 3、以下代码的调试结果为?( ) public class Bground extends Thread{ public static void main(String argv[]){ Bground b = new Bground(); b.run(); } public void start(){ for (int i = 0; i <10; i++){ System.out.println("Value of i = " + i); } } } A. 编译错误,没有定义线程的run方法; B. 由于没有定义线程的run方法,而出现运行错误; C. 编译通过,运行输出values 0 to 9 D. 编译通过,运行无输出 4、有关线程的叙述正确的有: ( ) A. 通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。 B. 可以获得对任何对象的互斥锁定。 C. 线程通过调用对象的synchronized 方法可取得对象的互斥锁定。 D. 线程调度算法是平台独立的。 5、以下哪个是线程类的方法? A. yield() B. sleep(long msec) C. go() D. stop() 6、以下哪个最准确描述synchronized 关键字?

Linux系统编程实验六进程间通信

实验六:进程间通信 实验目的: 学会进程间通信方式:无名管道,有名管道,信号,消息队列, 实验要求: (一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一消息队列,实现向队列中存放数据和读取数据 实验器材: 软件:安装了Linux的vmware虚拟机 硬件:PC机一台 实验步骤: (一)无名管道的使用 1、编写实验代码pipe_rw.c #include #include #include #include #include #include int main() { int pipe_fd[2];//管道返回读写文件描述符 pid_t pid; char buf_r[100]; char* p_wbuf; int r_num; memset(buf_r,0,sizeof(buf_r));//将buf_r初始化 char str1[]=”parent write1 “holle””; char str2[]=”parent write2 “pipe”\n”; r_num=30; /*创建管道*/ if(pipe(pipe_fd)<0) { printf("pipe create error\n"); return -1; } /*创建子进程*/ if((pid=fork())==0) //子进程执行代码 {

//1、子进程先关闭了管道的写端 close(pipe_fd[1]); //2、让父进程先运行,这样父进程先写子进程才有内容读sleep(2); //3、读取管道的读端,并输出数据 if(read(pipe_fd[0],buf_r, r_num)<0) { printf(“read error!”); exit(-1); } printf(“%s\n”,buf_r); //4、关闭管道的读端,并退出 close(pipe_fd[1]); } else if(pid>0) //父进程执行代码 { //1、父进程先关闭了管道的读端 close(pipe_fd[0]); //2、向管道写入字符串数据 p_wbuf=&str1; write(pipe_fd[1],p_wbuf,sizof(p_wbuf)); p_wbuf=&str2; write(pipe_fd[1],p_wbuf,sizof(p_wbuf)); //3、关闭写端,并等待子进程结束后退出 close(pipe_fd[1]); } return 0; } /*********************** #include #include #include #include #include #include int main() { int pipe_fd[2];//管道返回读写文件描述符 pid_t pid; char buf_r[100]; char* p_wbuf; int r_num;

java多线程试题答案

多线程 一.选择题 1.下列说法中错误地一项是() A.线程就是程序.线程是一个程序地单个执行流 B.多线程是指一个程序地多个执行流.多线程用于实现并发 2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态() A.等待阴塞状态下地线程被()唤 B.等待阻塞状态下地纯种被()中断 C.等待时间到 D.等待阻塞状态下地线程调用()方法 3.下列哪个方法可以使线程从运行状态进入其他阻塞状态() A. 4.下列说法中错误地一项是() A.一个线程是一个类地实例 B.线程从传递给纯种地实例()方法开始执行 C.线程操作地数据来自实例 D.新建地线程调用()方法就能立即进入运行状态 5.下列关于类提供地线程控制方法地说法中,错误地一项是() A.在线程中执行线程地()方法,则线程等待直到执行完成 B.线程通过调用()方法来中断其阻塞状态 C.若线程调用方法()返回值为,则说明正在执行中 D.()方法返回当前线程地引用 6.下列说法中,错误地一项是() A.对象锁在()语句执行完之后由持有它地线程返还 B.对象锁在()语句中出现异常时由持有它地线程返还 C.当持有锁地线程调用了该对象地()方法时,线程将释放其持有地锁 D.当持有锁地线程调用了该对象地构造方法时,线程将释放其持有地锁 7.下面地哪一个关键字通常用来对对象地加锁,从而使得对对象地访问是排他地 A. 二.填空题 . 在操作系统中,被称做轻型地进程是线程 . 多线程程序设计地含义是可以将一个程序任务分成几个并行地任务 . 在程序中,()方法地实现有两种方式:实现接口和继承类.多个线程并发执行时,各个线程中语句地执行顺序是确定地,但是线程之间地相对执行顺序是不确定地 中地对象锁是一种独占地排他锁 .程序中可能出现一种情况:多个线种互相等待对方持有地锁,而在得到对方地锁之前都不会释放自己地锁,这就是死锁b5E2R。 .线程地优先级是在类地常数和之间地一个值 .处于新建状态地线程可以使用地控制方法是()和(). .一个进程可以包含多个线程 三.简答题

Linux进程间通信(2)实验报告

实验六:Linux进程间通信(2)(4课时) 实验目的: 理解进程通信原理;掌握进程中信号量、共享内存、消息队列相关的函数的使用。实验原理: Linux下进程通信相关函数除上次实验所用的几个还有: 信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。要调用的第一个函数是semget,用以获得一个信号量ID。 int semget(key_t key, int nsems, int flag); key是IPC结构的关键字,flag将来决定是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。 semctl函数用来对信号量进行操作。 int semctl(int semid, int semnum, int cmd, union semun arg); 不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。 semop函数自动执行信号量集合上的操作数组。 int semop(int semid, struct sembuf semoparray[], size_t nops); semoparray是一个指针,它指向一个信号量操作数组。nops规定该数组中操作的数量。 ftok原型如下: key_t ftok( char * fname, int id ) fname就是指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。 当成功执行的时候,一个key_t值将会被返回,否则-1 被返回。 共享内存 共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。首先要用的函数是shmget,它获得一个共享存储标识符。 #include #include #include int shmget(key_t key, int size, int flag); 当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。 void *shmat(int shmid, void *addr, int flag); shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地

Windows进程间各种通信方式浅谈

Windows进程间各种通信方式浅谈 1、Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是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机制(有名管道、

数据分析中常用的10种图表及制作过程

数据分析中常用得10种图表 1折线图 折线图可以显示随时间(根据常用比例设置)而变化得连续数据,因此非常适用于显示在相等时间间隔下数据得趋势。 表1家用电器前半年销售量 月份冰箱电视电脑平均销售量合计 1月68 45 139 84 252 2月33 66 166 88 265 3月43 79 160 94 282 4月61 18 115 65 194 5月29 19 78 42 126 6月22 49 118 63 189 图1 数点折线图 图2堆积折线图

图3百分比堆积折线图 2柱型图 柱状图主要用来表示各组数据之间得差别。主要有二维柱形图、三维柱形图、圆柱图、圆锥图与棱锥图。 图4二维圆柱图 3堆积柱形图 堆积柱形图不仅可以显示同类别中每种数据得大小还可以显示总量得大小。 图5堆积柱形图

图6百分比堆积柱形图 百分比堆积柱形图主要用于比较类别柱上每个数值占总数得百分比,该图得目得就是强调每个数据系列得比例。 4线-柱图 图7线-柱图 这种类型得图不仅可以显示出同类别得比较,更可以显示出平均销售量得趋势情况。 5两轴线-柱图 月份工资收 入(元) 其她收入 (元) 工资占其她收入得百分 比 1月5850 12000 48、75% 2月5840 15000 38、93% 3月4450 20000 22、25%

4月6500 10000 65、00% 5月5200 18000 28、89% 6月5500 30000 18、33% 图8两轴线-柱图 操作步骤:01 绘制成一样得柱形图,如下表所示: 图1 操作步骤02: 左键单击要更改得数据,划红线部分所示,单击右键选择【设置数据系列格式】,打开盖对话框,将【系列选项】中得【系统绘制在】更改为“次坐标轴”,得到图4得展示结果。

三种NAT实现方式配置实例

NAT有3种实现方式,包括有静态NAT动态地址NAT和端口多路复用地址转换三种技术类型。静态NAT是把内部网络中的每个主机地址永久映射成外部网络中的某个合法地址;动态地址NAT是采用把外部网络中的一系列合法地址使用动态分配的方法映射到内部网络;端口多路复用地址转换是把内部地址映射到外部网络的一个IP地址的不同端口上。根据不同的需要,选择相应的NAT技术类型。 一般我们实际工作中都使用复用NAT,即复用断口NAT,也叫PNAT. 所以掌握最后配置就可以了。 静态NAT 配置步骤: 首先,配置各接口的IP地址。内网使用私有IP.外网使用公网IP.并指定其属于内外接口。 其次,定义静态建立IP 地址之间的静态映射。最后,指定其默认路由。 Router>en (进入特权模式) Router#config (进入全局配置模式) Configuring From terminal, memory, or network [terminal]? Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ho R3 (命名为R3) R3(config)#no ip domain-lo (关闭域名查询,在实验环境中,敲入错误的命令, 它将进行域名查询,故关闭他) R3(config)#line c 0 (进入线路CONSOLE 接口0 下) R3(config-line)#logg syn (启用光标跟随,防止日志信息冲断命令显示的位置) R3(config-line)#exec-t 0 0 (防止超时,0 0 为永不超时) R3(config-line)#exit R3(config)#int e0 (进入以太网接口下) R3(config-if)#ip add 192.168.1.1 255.255.255.0(设置IP 地址) R3(config-if)#ip nat inside (设置为内部接口) R3(config-if)#no shut R3(config-if)#exit R3(config)#int ser1 (进入串口下) R3(config-if)#ip add 100.0.0.1 255.255.255.0 R3(config-if)#no shut R3(config-if)#ip nat outside (设置为外部接口) R3(config-if)#exit R3(config)#ip nat inside source static 191.168.1.1 100.0.0.(1 设置静态转换,其中ip nat inside source 为NAT 转换关键字,这里是静态,故为STATIC ) R3(config)#ip classless R3(config)#ip route 0.0.0.0 0.0.0.0 sO这里是出口或者下一跳地址) R3(config)#exit 动态NAT 配置步骤: 首先,配置各需要转换的接口的IP,设置内外网IP等。其次,定义动态地址转换池列表再次,配置ACL 列表,需要转换的内网IP 地址(或者网段)。最后,设置转换后的出口地址段及MASK (多IP 可以多分流,减轻转换后的负担)

进程间通信的四种方式

一、剪贴板 1、基础知识 剪贴板实际上是系统维护管理的一块内存区域,当在一个进程中复制数据时,是将这个数据放到该块内存区域中,当在另一个进程中粘贴数据时,是从该内存区域中取出数据。 2、函数说明: (1)、BOOL OpenClipboard( ) CWnd类的OpenClipboard函数用于打开剪贴板。若打开剪贴板成功,则返回非0值。若其他程序或当前窗口已经打开了剪贴板,则该函数返回0值,表示打开失败。若某个程序已经打开了剪贴板,则其他应用程序将不能修改剪贴板,直到前者调用了CloseClipboard函数。 (2)、BOOL EmptyClipboard(void) EmptyClipboard函数将清空剪贴板,并释放剪贴板中数据的句柄,然后将剪贴板的所有权分配给当前打开剪贴板的窗口。 (3)、HANDLE SetClipboardData(UINT uFormat, HANDLE hMem) SetClipboardData函数是以指定的剪贴板格式向剪贴板上放置数据。uFormat指定剪贴板格式,这个格式可以是已注册的格式,或是任一种标准的剪贴板格式。CF_TEXT表示文本格式,表示每行数据以回车换行(0x0a0x0d)终止,空字符作为数据的结尾。hMem指定具有指定格式的数据的句柄。hMem参数可以是NULL,指示采用延迟提交技术,则该程序必须处理WM_RENDERFORMA T和WM_RENDERALLFORMATS消息。应用程序在调用SetClipboardData函数之后,就拥有了hMem参数所标识的数据对象,该应用程序可以读取该数据对象,但在应用程序调用CloseClipboard函数之前,它不能释放该对象的句柄,或者锁定这个句柄。若hMem标识了一个内存对象,那么这个对象必须是利用GMEM_MOVEABLE标志调用GlobalAlloc函数为其分配内存。 注意:调用SetClipboardData函数的程序必须是剪贴板的拥有者,且在这之前已经打开了剪贴板。 延迟提交技术:当一个提供数据的进程创建了剪贴板数据之后,直到其他进程获取剪贴板数据之前,这些数据都要占据内存空间。若在剪贴板上放置的数据过大,就会浪费内存空间,降低对资源的利用率。为了避免这种浪费,就可以采用延迟提交计数,也就是由数据提供进程先提供一个指定格式的空剪贴板数据块,即把SetClipboardData函数的hMem参数设置为NULL。当需要获取数据的进程想要从剪贴板上得到数据时,操作系统会向数据提供进程发送WM_RENDERFORMA T消息,而数据提供进程可以响应这个消息,并在此消息的响应函数中,再一次调用SetClipboardData函数,将实际的数据放到剪贴板上。当再次调用SetClipboardData函数时,就不再需要调用OpenClipboard函数,也不再需要调用EmptyClipboard函数。也就是说,为了提高资源利用率,避免浪费内存空间,可以采用延迟提交技术。第一次调用SetClipboardData函数时,将其hMem参数设置为NULL,在剪贴板上以指定的剪贴板格式放置一个空剪贴板数据块。然后直到有其他进程需要数据或自身进程需要终止运行时再次调用SetClipboardData函数,这时才真正提交数据。 (4)、HGLOBAL GlobalAlloc( UINT uFlags,SIZE_T dwBytes); GlobalAlloc函数从堆上分配指定数目的字节。uFlags是一个标记,用来指定分配内存的方式,uFlags为0,则该标记就是默认的GMEM_FIXED。dwBytes指定分配的字节数。

动态软件体系结构描述方法

学号 1206 年级 2012级 动态软件体系结构描述D-ADL方法理解与研究 专业班级计算机(2)班 姓名 联系方式 15 任课教师周 2015年5月 中国南京

摘要 D-ADL是一种刻画软件的动态行为的描述方法,该方法是由我国学者李长云提出的。在D—ADL中,组件、连接件和体系结构风格定义为抽象类型,系统行为被模型化为进程,构件和连接件的交互点则被模型化为通道,它将动态行为从计算行为中分离出来,其结果能够被预先推导。 关键词:动态软件体系结构;D-ADL

根据软件体系结构在运行时的演化方式,可以分为静态软件体系结构和动态软件体系结构。软件体系结构的动态演化包括组件或连接件的创建或删除、组件的更新、调整负载平衡等几种情况。D-ADL便是一种为动态体系结构建模提供支持的方法。 D-ADL遵循Wright等给出的SA描述框架,并且D-ADL将高阶多型π演算作为行为语义基础,凭借高阶π演算描述动态系统的特征,D-ADL允许构件、连接件和配置产生变更,并使得对SA的自动化分析成为可能。D-ADL将类型与实例区分开来,构件类型是实现构件重用的手段。 构件具有三个基本组成部分:接口部分、行为部分和属性部分。构件分有原子构件和复合构件两种。原子构件是指不具备内部结构的构件。为了进一步促进原子构件的重用,构件可以参数化,通过输入不同的参数,来提高构件的灵活性。复合构件是由多个构件实例和连接件实例组装而成的,它在规约层次上表达了成员之间的组合。与原子构件类似,复合构件也可进行参数化,从而提高构件的可重用性。 连接件是一种特殊的构件,同样地,连接件也分为原子连接件和复合连接件两类。原子连接件语法规约类似于原子构件,仅仅是计算行为描述换成了路由行为。通过结构化组合,多个连接件和构件也能形成复合连接件。 在D-ADL中,动态行为规约是通过choreographer来处理的.动态行为本质上是对体系结构的动态重配置,涉及到如下的体系结构变动: (1)动态创建新的构件实例和连接件实例以及新的端口和通道; (2)动态删除构件实例和连接件实例以及端口和通道; (3)体系结构元素之间连接的改变。 在π演算中定义了两种行为等价关系:强等价关系和弱等价关系。强等价关系既考虑系统的内部行为,又考虑系统的外部行为;而弱等价关系是一种不考虑系统的内部行为的行为等价理论,即如果系统A和B弱互模拟,则A和B表现出来的外部行为是等价的。它定义了如下规则: 1.设构件A和B的行为分别被形式化为进程Pa和Pb,则要使得A和B能够相互联机替换,必要的条件是Pa和Pb具备弱等价关系。D-ADL以高阶多型π演算作为行为语义基础,因此构件的行为规约能够从D-ADL描述出发转换为高阶π演算进程,进而利用规则1和高阶π演算弱等价判定理论及其工具推导出构件能否替。 2.设进程PA表示构件A的行为,进程PB表示构件B的行为,若构件A是对构件B的求精,则PA观察弱模拟PB。分支弱模拟意指对不可观察的活动序列进行抽象,在跟踪每一

linux进程间通讯的几种方式的特点和优缺点

1. # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道(named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 # 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 # 消息队列( message queue ) :消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 # 信号( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存( shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。 # 套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 管道的主要局限性正体现在它的特点上: 只支持单向数据流; 只能用于具有亲缘关系的进程之间; 没有名字; 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配一个页面大小);管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息(或命令、或记录)等等; 2. 用于进程间通讯(IPC)的四种不同技术: 1. 消息传递(管道,FIFO,posix和system v消息队列) 2. 同步(互斥锁,条件变量,读写锁,文件和记录锁,Posix和System V信号灯) 3. 共享内存区(匿名共享内存区,有名Posix共享内存区,有名System V共享内存区) 4. 过程调用(Solaris门,Sun RPC) 消息队列和过程调用往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享内存区

进程间通信方式比较

进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。 2.信号(signal): 信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致得。 3.消息队列(message queue): 消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。 消息缓冲通信技术是由Hansen首先提出的,其基本思想是:根据”生产者-消费者”原理,利用内存中公用消息缓冲区实现进程之间的信息交换. 内存中开辟了若干消息缓冲区,用以存放消息.每当一个进程向另一个进程发送消息时,便申请一个消息缓冲区,并把已准备好的消息送到缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程收到发送里程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出所需的信息,然后把消息缓冲区不定期给系统.系统负责管理公用消息缓冲区以及消息的传递. 一个进程可以给若干个进程发送消息,反之,一个进程可以接收不同进程发来的消息.显然,进程中关于消息队列的操作是临界区.当发送进程正往接收进程的消息队列中添加一条消息时,接收进程不能同时从该消息队列中到出消息:反之也一样. 消息缓冲区通信机制包含以下列内容:

(1) 消息缓冲区,这是一个由以下几项组成的数据结构: 1、消息长度 2、消息正文 3、发送者 4、消息队列指针 (2)消息队列首指针m-q,一般保存在PCB中。 (1)互斥信号量m-mutex,初值为1,用于互斥访问消息队列,在PCB中设置。 (2)同步信号量m-syn,初值为0,用于消息计数,在PCB中设置。(3)发送消息原语send (4)接收消息原语receive(a) 4.共享内存(shared memory): 可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。 这种通信模式需要解决两个问题:第一个问题是怎样提供共享内存;第二个是公共内存的互斥关系则是程序开发人员的责任。 5.信号量(semaphore): 主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。 6.套接字(socket); 这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 https://www.sodocs.net/doc/7d9043378.html,/eroswang/archive/2007/09/04/1772350.aspx linux下的进程间通信-详解

[Excel图表]制作动态分析图表的三种方法

制作动态分析图表的三种方法 (文/ ExcelPro的图表博客) 动态图表是图表分析的较高级形式,一旦从静态图表跨入动态图表,则分析的效率和效果都会进入另一个境界,可以让用户进行交互式的比较分析。商业杂志上的图表都是静态图表,现在它们的在线杂志则经常提供交互式图表。作为分析人士,制作一个优秀的分析模型,必然不能缺少动态图表这个元素。 水晶易表比较适合于做动态图表,CX中可支持图表的切片、钻取等操作,如点击饼图的某个扇区、柱形图的某个柱子,可以让另外一个图表跟随变化。Excel中一般可以做到切片操作,钻取操作则难以做到,好像没有这种事件可以捕捉。好在是一般商业分析中,我们只需要做变化条件的切片操作就可以了。这篇日志就整理一下有关Excel动态图表的内容。 一、动态图表的做法 很多人觉得动态图表很高级、很神秘,其实它的制作原理也很简单,技巧只在于变化图表的数据源。Excel中常见的做法有3种。 1、辅助序列法。 这是最常用的办法,比较直观和容易理解。设置一个辅助数据区域,根据用户的操作选择,将目标数据从源数据区域引用到辅助数据区域,用辅助数据作图。当用户选择改变,辅助区域的数据随之变化,图表也就变化。

引用数据一般要用到几个函数,offset、index(+match)、Vlookup、choose等。这几个函数是excel的精髓之一,特别是Vlookup被称为查找函数之王,用得好可以完成很多分析任务,老外的书中有很多例子。 点这里查看上图的案例文件。 2、定义名称法。 与前述方法相比,省去辅助数据区域,直接用名称提供图表数据源。根据用户选择,将目标数据定义到名称中,用名称做图表的数据源。当用户选择改变,名称所指向的区域随之变化,图表也变化。 方法同前,一般使用offset函数。因需多一道脑筋,所以我一般用这种方法不多,今天暂不整理。 以上两种方法,如果需要详细了解,可参考这个帖子,snood版主整理的很好了,我也不啰嗦了。 3、图片引用法。 这种方法不多见,一般在人事管理应用中有用到,我把它用到图表的动态切换。 前两种方法都是通过切换同一个图表的数据源来实现图表的动态变化,这种方法则是通过引用不同的图表来实现动态图表,可以支持不同数据源、不同类型、不同图表格式的图表的动态切换。 关于这个方法说详细一点:

动态网站开发模拟试题及满分答案

1 ()技术不能将网页元素有静态转变为动态 2 https://www.sodocs.net/doc/7d9043378.html,的数据源可以是: 3 https://www.sodocs.net/doc/7d9043378.html,对数据源进行的操作包括: 4 https://www.sodocs.net/doc/7d9043378.html,是一种 5 https://www.sodocs.net/doc/7d9043378.html,数据库应用程序的开发流程包括: 6 https://www.sodocs.net/doc/7d9043378.html,提供了哪些对象进行状态管理: 7 CompareValidator用哪些属性指出要进行验证的两个控件的名称: 8 DataAdapter对象的常用属性包括: 9 NET 框架的组成包括 10 NET框架支持的开发语言包括: 11 NET数据提供程序的对象包括: 12 RangeValidator控件指定用于比较的数据类型的属性不是()。 13 Request对象的__属性可以获得客户端提交的数据。 14 SqlCommand对象的CommandType属性可以取值为: 15 TextBox控件的TextMode 属性可以设置为: 16 ValidatorSummary验证控件的作用不正确的是 17 ValidatorSummary验证控件的作用中没有 18 Web 服务器控件包括: 19 不可以跨服务器共享的服务器端状态管理技术是()。 20 当需要将TextBox控件作为密码输入框时(要求隐藏密码的代码),不能将控件的TextMode属性设置为()。 21 当需要用控件来输入性别(男、女)或婚姻状况(已婚、未婚)时,为了简化输入,下列控件不能选择以下哪个控件 22 定义网页标准控件的格式不正确的是。 23 定义验证错误信息的验证控件属性不正确的是()。 24 动态网页的扩展名可以是 25 对输入值范围进行验证的控件,不能选用()。 26 对输入值范围进行验证的控件是()。 27 对于应用程序状态的描述说法正确的是()。 28 方法能向网页内写入文本的是 29 关于Cookie状态说法正确的是()。 30 关于单文件页模型和代码隐藏页模型,以下说法正确的是: 31 关于会话状态说法正确的是()。 32 关于视图状态说法不正确的是()。 33 关于页面验证,说法不正确的是()。 34 关于应用程序状态说法不正确的是()。 35 集中显示验证错误信息的控件不可能是()。 36 可以设置过期时间的状态管理方式是()。 37 可以作为跨页数据传递手段的状态管理方式是()。 38 默认将状态数据保存在服务器内存中的状态管理方式是()。 39 若使用C#语言,网站中包含文件后缀有()。 40 使用SqlDataReader对象的注意事项: 41 使用SqlDataReader对象读取数据库的步骤一般包括: 42 使用服务器资源进行状态管理的有:

多线程练习题目

多线程练习题目

————————————————————————————————作者:————————————————————————————————日期:

多线程? 一、单项 1.下述哪个选项为真?() A.Error类是一个RoutimeException异常 B.任何抛出一个RoutimeException异常的语句必须包含在try块之内 C.任何抛出一个Error对象的语句必须包含在try块之内 D.任何抛出一个Exception异常的语句必须包含在try块之内 2.下列关于Java线程的说法哪些是正确的?( ) A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成 B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确 3.哪个关键字可以对对象加互斥锁?( ) A.transient B.synchronized C.serialize D.static 4.下列哪个方法可用于创建一个可运行的类?() A.public classXimplements Runable{ publicvoid run() {……}} B.public class XimplementsThread { public void run(){……} } C. public class X implements Thread { public int run() {……} } D.publicclass X implements Runable { protectedvoidrun(){……}} 5.下面哪个选项不会直接引起线程停止执行?( ) A.从一个同步语句块中退出来 B.调用一个对象的wait方法 C.调用一个输入流对象的read方法 D.调用一个线程对象的setPriority方法 6.使当前线程进入阻塞状态,直到被唤醒的方法是() A.resume()方法 B.wait()方法 C.suspend()方法D.notify()方法 7.运行下列程序,会产生的结果是( ) publicclassXextends Thread implements Runnable { public void run(){ System.out.println(“this is run()”); } publicstaticvoid main(String[] args) { Thread t=new Thread(newX()); t.start();

多线程练习题目

多线程 一、单项 1.下述哪个选项为真?( ) A.Error类是一个RoutimeException异常 B.任何抛出一个RoutimeException异常的语句必须包含在try块之内 C.任何抛出一个Error对象的语句必须包含在try块之内 D. 任何抛出一个Exception异常的语句必须包含在try块之内 2.下列关于Java线程的说法哪些是正确的?( ) A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成 B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题 C.Thread类属于java.util程序包 D.以上说法无一正确 3.哪个关键字可以对对象加互斥锁?( ) A.transient B.synchronized C.serialize D.static 4.下列哪个方法可用于创建一个可运行的类?() A.public class X implements Runable { public void run() {……} } B. public class X implements Thread { public void run() {……} } C. public class X implements Thread { public int run() {……} } D.public class X implements Runable { protected void run() {……} } 5.下面哪个选项不会直接引起线程停止执行?( ) A.从一个同步语句块中退出来 B.调用一个对象的wait方法 C.调用一个输入流对象的read方法 D.调用一个线程对象的setPriority方法 6.使当前线程进入阻塞状态,直到被唤醒的方法是( ) A.resume()方法 B.wait()方法 C.suspend()方法 D.notify()方法 7.运行下列程序,会产生的结果是( ) public class X extends Thread implements Runnable { public void run(){ System.out.println(“this is run()”); } public static void main(String[] args) { Thread t=new Thread(new X()); t.start(); } }

进程间的通信

实验三进程间的通信 【实验类型】 综合性实验 【目的要求】 学习如何利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通讯,并加深对上述通信机制的理解。 【内容提要】 1、了解系统调用pipe()、msgget()、msgsnd()、msgrcv ()、msgctl()、shmget()、shmat()、shmdt()、shmctl()的功能和实现过程。 2、编写一段程序,使其用管道来实现父子进程之间的进程通讯。子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent!”。父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。 3、编写一段程序,使用系统调用fork()来创建两个子进程CLIENT进程和SERVER进程,使其用消息缓冲队列来实现CLIENT进程和SERVER进程之间的通信。SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。SERVER每接收到一条消息后显示一句“(server) received”。CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是SERVER端需要的结束信号。CLIENT每发送一条消息后显示一句“(client) sent”。父进程在SERVER和CLIENT均退出后结束。 4、编写一个与3具有类似功能的程序,使其用共享存储区来实现两个进程之间的通讯。 【主要仪器设备】 每人一台计算机,硬件要求:CPU PII以上,64M内存,1OOM硬盘空间即可;软件要求: Linux操作系统。

Linux下的进程间通信-详解

Linux下的进程间通信-详解 详细的讲述进程间通信在这里绝对是不可能的事情,而且笔者很难有信心说自己对这一部分内容的认识达到了什么样的地步,所以在这一节的开头首先向大家推荐著 名作者Richard Stevens的著名作品:《Advanced Programming in the UNIX Environment》,它的中文译本《UNIX环境高级编程》已有机械工业出版社出版,原文精彩,译文同样地道,如果你的确对在Linux下编程有浓 厚的兴趣,那么赶紧将这本书摆到你的书桌上或计算机旁边来。说这么多实在是难抑心中的景仰之情,言归正传,在这一节里,我们将介绍进程间通信最最初步和最 最简单的一些知识和概念。 首先,进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来, 进程间通信(IPC:InterProcess Communication)不包括这种似乎比较低级的通信方法。Unix系统中实现进程间通信的方法很多,而且不幸的是,极少方法能在所有的Unix系 统中进行移植(唯一一种是半双工的管道,这也是最原始的一种通信方式)。而Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信 方法:管道、消息队列、共享内存、信号量、套接口等等。下面我们将逐一介绍。 2.3.1 管道 管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者用于父进程和子进程间的通信,后者用于运行于同一台机器上的任意两个进程间的通信。 无名管道由pipe()函数创建: #include int pipe(int filedis[2]); 参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes[1]为写而打开。filedes[1]的输出是filedes[0]的输入。下面的例子示范了如何在父进程和子进程间实现通信。 #define INPUT 0 #define OUTPUT 1 void main() { int file_descriptors[2]; /*定义子进程号 */ pid_t pid; char buf[256]; int returned_count; /*创建无名管道*/ pipe(file_descriptors); /*创建子进程*/ if((pid = fork()) == -1) { printf("Error in fork\n"); exit(1); } /*执行子进程*/ if(pid == 0) { printf("in the spawned (child) process...\n"); /*子进程向父进程写数据,关闭管道的读端*/ close(file_descriptors[INPUT]); write(file_descriptors[OUTPUT], "test data", strlen("test data"));

相关主题