实验五进程间通信

合集下载

进程间通信

进程间通信

《操作系统》实验报告年级、专业、班级 姓名进程间通信实验题目实验时间 2014.11.21 实验地点 A主0410实验成绩 实验性质 □验证性 □设计性 □综合性 教师评价:□算法/实验过程正确; □源程序/实验内容提交 □程序结构/实验步骤合理;□实验结果正确; □语法、语义正确; □报告规范;其他:评价教师签名:一、实验目的1. 了解管道通信的特点,掌握管道通信的使用方法。

2. 了解消息队列通信机制及原理,掌握消息队列相关系统调用的使用方法及功能。

3. 了解Linux系统共享存储区的原理及使用方法。

二、实验项目内容1. 管道通信(1)父进程创建管道和两个子进程p1和p2。

(2)子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,写完关闭文件,然后向管道写入一条消息“ok",目的是通知进程p2可以读取文件内容了。

(3)子进程p2通过管道读取消息,如果消息是“ok”,则打开文件,读取文件内容,并将其输出到屏幕上,关闭文件.2. 消息队列(1)父进程创建消息队列和两个子进程p1和p2。

(2)子进程p1打开给定文件(如果没有,则创建文件),并向文件中写数据,写完关闭文件,然后向消息队列写入一条消息“1",目的是通知进程p2可以读取文件内容了。

(3)子进程p2从消息队列读取消息,如果收到消息,则打开文件,读取文件内容,并将其输出道屏幕上,关闭文件。

3. 共享存储(1)由父进程建立一块共享存储区,并创建两个子进程p1,p2,父进程负责查询存储区状态,以及删除该存储区。

(2)子进程p1链接到该共享存储区,然后向存储区写入数据,写完断开链接。

(3)子进程p2链接到该共享存储区,从存储区读数据,然后断开链接。

注意:为了便于各进程对存储区访问的同步,这里使用信号量方法。

三、实验过程或算法1. 管道通信#include<unistd.h>#include<stdio.h>#include<string.h>#include<stdlib.h>int main() {int pipefd[2];pid_t pid;char buf[100];int n;为0memset(buf, 0, sizeof(buf));//clear bufif(pipe(pipefd) < 0) {perror("pipe");exit(0);}pid = fork();if(pid == 0) { //child process 1close(pipefd[0]);//close read fdchar *msg="Hello,I am a Pipe user.";write(pipefd[1], msg, 50);}else if(pid > 0) {pid = fork();if(pid == 0) { //child process 2close(pipefd[1]);//close write fdread(pipefd[0], buf, sizeof(buf));fprintf(stdout, "read from pipe is:%s\n", buf);}else if(pid > 0) exit(0);}}2.消息队列//发送消息,msqid是队列id,msg是要发送的消息void sendmsg(int msqid,mymesg msg){printf("msqid:%d,msg:%s\n",msqid,msg.mtext);if((msgsnd(msqid, &msg, sizeof(msg.mtext), IPC_NOWAIT)) != 0){//消息发送函数printf("pid_1:send msg error!\n");}else{printf("pid_1:send msg: %s succeed!\n", msg.mtext);}}//接收消息,msqid是队列idint rcvmsg(int msqid){mymesg msg={0};AIT);int msg_len = msgrcv(msqid, &msg, sizeof(msg.mtext), 0, IPC_NOW //接收消息函数if(msg_len < 0){printf("pid_2:receive msg error!\n");return 0;}printf("pid_2:recv msg: %s\n", msg.mtext);return 1;}3.共享存储创建共享存储区 shmid = shmget(IPC_PRIV A TE, SIZE, IPC_CREAT|0600 ) ;//{if ( shmid < 0 )perror("get shm ipc_id error") ;return -1 ;}pid = fork() ;子进程p1if ( pid == 0 ){ //printf("I'm child1 process,my pid is %d.\n",getpid());P操作sem_p(sem_id); //链接到存储区 shmaddr = (char *)shmat( shmid, NULL, 0 ) ;//if ( (int)shmaddr == -1 ){perror("shmat addr error") ;return -1 ;}向存储区写数据strcpy( shmaddr, "Hi,This is share memory!\n") ;//shmdt( shmaddr ) ;//断开链接V操作sem_v(sem_id); //父进程} else if ( pid > 0) {//printf("I'm father process,my pid is %d.\n",getpid());pid = fork();sleep(1);子进程2创建if(pid==0){//printf("I'm child2 process,my pid is %d.\n",getpid());P操作sem_p(sem_id); //读取存储区状态到buf中flag = shmctl( shmid, IPC_STAT, &buf) ;//{if ( flag == -1 )perror("shmctl shm error") ;return -1 ;}printf("shm_segsz =%d bytes\n", buf.shm_segsz ) ;printf("parent pid=%d, shm_cpid = %d \n", getppid(), buf.shm_cpid ) ;printf("chlid pid=%d, shm_lpid = %d \n",pid, buf.shm_lpid ) ;printf("shm_segsz =%d \n", buf.shm_perm.mode );shmaddr = (char *) shmat(shmid, NULL, 0 ) ;链接到存储区,读取其中数据if ( (int)shmaddr == -1 ){//perror("shmat addr error") ;return -1 ;}//打印数据到屏幕printf("%s", shmaddr) ;V操作sem_v(sem_id); //断开链接shmdt( shmaddr) ;//}else{perror("fork error.") ;shmctl(shmid, IPC_RMID, NULL) ;}删除该存储区shmctl(shmid, IPC_RMID, NULL) ;//return 0 ;}四、实验结果及分析和(或)源程序调试过程(包含程序使用方法、程序运行截图),实验过程中遇到的问题分析与心得体会。

实验5 进程间通信实验

实验5 进程间通信实验

实验五进程间通信实验一、实验目的1、了解什么是信号。

2、熟悉LINUX系统中进程之间软中断通信的基本原理。

3、了解什么是管道4、熟悉UNIX/LINUX支持的管道通信方式二、实验内容1、编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:Child process 1 is killed by parent!Child process 2 is killed by parent!父进程等待两个子进程终止后,输出以下信息后终止:Parent process is killed!<参考程序>#include<stdio.h>#include<signal.h>#include<unistd.h>#include<sys/types.h>#include<sys/wait.h>int wait_mark;void waiting(),stop();void main(){int p1, p2;signal(SIGINT,stop);while((p1=fork())==-1);if(p1>0) /*在父进程中*/{while((p2=fork())==-1);If(p2>0) /*在父进程中*/{wait_mark=1;waiting(0);kill(p1,10);kill(p2,12);wait( );wait( );printf("parent process is killed!\n");exit(0);}else /*在子进程2中*/{wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf("child process 2 is killed by parent!\n");lockf(1,0,0);exit(0);}}else /*在子进程1中*/{wait_mark=1;signal(10,stop);waiting();lockf(1,1,0);printf("child process 1 is killed by parent!\n");lockf(1,0,0);exit(0);}}void waiting(){while(wait_mark!=0);}void stop(){wait_mark=0;}实验要求:⑴运行程序并分析结果。

实验五 进程通信

实验五  进程通信

(2)读管道 在管道创建后,希望从管道中读取数据的进程使 用读文件描述符fd[0]作为参数,调用read( )系统调用。 #include <unistd.h> ssize_t read(int fd,void *buf,size_t nbytes); 返回:读到的字节数,若已到文件尾为0,若出错 为-1。 (3)写管道 向管道中写入数据的进程使用写文件描述符fd[1] 作为参数,调用write( )系统调用。 #include <unistd.h> ssize_t write(int fd,const void *buf,size_t nbytes); 返回:若成功为已写的字节数,若出错为-1。
2. 管道是UNIX系统中最早为两个进程之间提 供的一种通信机制。管道是一种单向的、先入 先出的、无结构的、大小固定的通信通道。写 进程在管道的一端写入数据,读进程从管道的 另一端读出数据。如果两个或多个进程同时对 一个进程进行读写,那么这些进程必须使用锁 机制或者信号量机制对其进行同步。 管道分为无名管道和有名管道。无名管道 没有名字,所以只能提供给进程家族中的父子 进程间通信使用,而有名管道则用于没有家族 关系的任意两个进程之间的通信。
wait(0); read(fd[0], inpipe, 50); printf(“%s\n”, inpipe); wait(0); read(fd[0], inpipe, 50); printf(“%s\n”, inpipe); exit(0);
}
} }Байду номын сангаас四. 试验总结
1. 写出试验报告。 2. 为程序添加注释。 3. 分析信号通信和管道通信各自的特点。

2. 编写一段程序,实现进程的管道通信。 使用系统调用pipe( )建立一条管道,创建两个子进程 P1和P2。 让P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程则从管道中读出来自于两个子进程的信息, 显示在屏幕上。要求:父进程先接受子进程P1发来的 消息,然后再接受子进程P2发来的消息。 参考程序如下:

实验五:进程间通信

实验五:进程间通信

实验五:进程间通信●实验目的:学会进程间通信方式:无名管道,有名管道,信号,共享内存●实验要求:(一)在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道(二)在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号(三)创建一共享内存,实现放进程间通信●实验器材:软件:安装了Linux的vmware虚拟机硬件:PC机一台●实验步骤:(一)无名管道的使用1、编写实验代码pipe_rw.c#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <string.h>#include <stdlib.h>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));/*创建管道*/if(pipe(pipe_fd)<0){printf("pipe create error\n");return -1;}/*创建子进程*/if((pid=fork())==0) //子进程执行代码{//1、子进程先关闭了管道的写端//2、让父进程先运行,这样父进程先写子进程才有内容读//3、读取管道的读端,并输出数据//4、关闭管道的读端,并退出}else if(pid>0) //父进程执行代码{//1、父进程先关闭了管道的读端//2、向管道写入字符串数据//3、关闭写端,并等待子进程结束后退出}return 0;}2、编译应用程序pipe_rw.c3、运行应用程序子进程先睡两秒让父进程先运行,父进程分两次写入“hello”和“pipe”,然后阻塞等待子进程退出,子进程醒来后读出管道里的内容并打印到屏幕上再退出,父进程捕获到子进程退出后也退出4、由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。

实验5 进程间通信:消息机制

实验5 进程间通信:消息机制

实验九进程间通信IPC:消息机制一、实验目的1.了解消息机制的相关函数。

2.了解消息队列的建立与使用。

3.能编写简单消息机制通信程序。

二、实验内容1. 建立消息队列2. 编写发送程序发送消息3. 编写接收程序接收消息三、预备知识1.创建和访问一个消息队列格式:int msgget(key_t key,int msgflag);返回值为对应消息的描述符(整型常量)。

2.发送消息(把一条消息添加到消息队列中去)格式:int msgsnd(int msqid,const void *smg_ptr,size_t msg_sz,int msgflag);3.接收消息格式:int msgrcv(int msqid,void *msg_ptr,size_t msg_sz,long int msgtype,int msgflag);4.控制和删除消息格式:int msgctl(int msqid,command,function);注意:msgsnd()和msgrcv()和msgctl()命令若执行成功,则返回0,若不成功,则返回-1。

四、实验步骤1.新建一个发送消息的程序x1.c$vi x1.c程序目的:可提示用户进行键盘输入字符,直到用户输入”end”,才结束输入。

将用户输入的内容存入消息队列,发送出去。

内容:#include<stdlib.h>#include<stdio.h>#include<string.h>#include<errno.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#define MAX_TEXT 512struct mform{long int mtype;char mtext[MAX_TEXT];}; /*定义了消息的结构*/int main(){int running=1;struct mform msg;int msgid;char buffer[BUFSIZ];msgid=msgget((key_t)1234,0666|IPC_CREAT);/*建立消息队列*/if(msgid==-1){/*若创建不成功,则显示出错信息,结束*/ printf(“msgget failed!\n”);exit(EXIT_FAILURE);}while(running)/*当创建消息队列成功后,则循环接收用户从键盘输入的字符,直到消息内容中出现“end”为止。

进程间通信实验报告

进程间通信实验报告

进程间通信实验报告班级:10网工三班学生姓名:谢昊天学号:1215134046实验目的和要求:Linux系统的进程通信机构 (IPC) 允许在任意进程间大批量地交换数据。

本实验的目的是了解和熟悉Linux支持的消息通讯机制及信息量机制。

实验内容与分析设计:(1)消息的创建,发送和接收。

①使用系统调用msgget (), msgsnd (), msgrev (), 及msgctl () 编制一长度为1k 的消息的发送和接收程序。

②观察上面的程序,说明控制消息队列系统调用msgctl () 在此起什么作用?(2)共享存储区的创建、附接和段接。

使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。

(3)比较上述(1),(2)两种消息通信机制中数据传输的时间。

实验步骤与调试过程:1.消息的创建,发送和接收:(1)先后通过fork( )两个子进程,SERVER和CLIENT进行通信。

(2)在SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。

当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER 。

SERVER每接收到一个消息后显示一句“(server)received”。

(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。

最后的一个消息,既是 SERVER端需要的结束信号。

CLIENT每发送一条消息后显示一句“(client)sent”。

(4)父进程在 SERVER和 CLIENT均退出后结束。

2.共享存储区的创建,附接和断接:(1)先后通过fork( )两个子进程,SERVER和CLIENT进行通信。

(2)SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1。

作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它的值设为-1.如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER.SERVER 每接收到一次数据后显示”(server)received”.(3)CLIENT端建立一个为75的共享区,当共享取得第一个字节为-1时, Server端空闲,可发送请求. CLIENT 随即填入9到0.期间等待Server端再次空闲.进行完这些操作后, CLIENT退出. CLIENT每发送一次数据后显示”(client)sent”.(4)父进程在SERVER和CLIENT均退出后结束。

实验五 Linux进程间通信05010501

实验五  Linux进程间通信05010501
lockf(fd[1],1,0); sprintf(OutPipe, "child 2 process is sending message!"); write(fd[1],OutPipe,50); sleep(5);
lockf(fd[1],0,0); exit(0); } else{ wait(0); read(fd[0],InPipe,50); printf("%s\n",InPipe); wait(0); read(fd[0],InPipe,50); printf("%s\n",InPipe); exit(0); } } } 实验要求:运行程序并分析结果,将上面程序修改成,在父进程中用 pipe()建立一条管道, 往管道里写字符串,两个子进程分别接收父进程往管道里写的字符串。
lockf(fd[1],1,0); sprintf(OutPipe, "child 1 process is sending message!"); write(fd[1],OutPipe,50); sleep(5); lockf(fd[1],0,0); exit(0); } else{
while((pid2=fork())== -1); if(pid2 == 0) {
//printf("child2 exit status is %d\n", WEXITSTATUS(status2));
printf("parent process is killed!\n");
exit(0);
} else{
/*在子进程 2 中*/
wait_mark=1; signal(12,stop); //捕捉到中断信号 12 后,调用 stop 函数

实验五进程间通信实验

实验五进程间通信实验

实验五进程间通信实验(二)实验目的:1.通过基础实验,基本掌握无名管道、有需管道的程序设计。

2.通过编写程序,使读者掌握信号处理程序设计方法。

实验内容:1.无名管道程序设计:在父进程中创建一个无名管逍,并创建子进程:在父进程中写该管道,并用子进程将内容读出。

2.有名管道程序设计:创建两个进程,在A进程中创建一个有飲管道,并向英写入数据,通过B进程从有统管道中读出数据。

3.信号处理程序设计:在进程中为SIGBUS注册处理函数,并向该进程发送SIGBUS信号来触发信号处理函数。

实验过程:(一)无名管道程序设计实验代码:/* */#include <>#include <sys/>#include o#include o#include o#include o #(lefine MAX_DATA_LEN 256#define DELAY.TIMElint inain(){pid_t pid;int pipe_f(i[2];char buf[MAX_DATA_LEN];const char data[] = "Pipe Test Program"; int real_read, real_write;memset((void*)buf, 0, sizeof(buf));/*创建管道*/if (pipe(pipe_fd) < 0)printf(M pipe create error\n M);exit(l);}/*创建一子进程*/if ((pid = fork()) == 0){/*子进程关闭写描述符,并通过使子进程暂停1秒等待父进程已关闭相应的读描述符*/close(pipe_fd[l]);sleep(DELAY_TIME * 3);/*子进程读取管道内容*/if ((real_read = read(pipe_fd[O], buf, MAX_DATA_LEN)) > 0){printf(u%d bytes read from the pipe is ’%s'\n”, real_read, buf);}/*关闭子进程读描述符*/close(pipe_fd[OJ);exit(O);}else if (pid > 0){/*父进程关闭读描述符,并通过使父进程暂停1秒等待子进程已关闭相应的写描述符*/close(pipe_fd(0]); s!eep(DELAY_TIME);/*父进程向管道中写入字符串*/if((real_write = write(pipe_fd[l], data, strlen((const char*)data))) !=・1) {printf(u Parent wrote %d bytes : real_write, data);}/*关闭父进程写描述符*/close(pipe_fd[l]);/*收集子进程退出信息*/waitpid(pid9 NULL, 0);exit(O);}}将该程序编译,运行。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五进程间通信UNIX/LINUX系统的进程间通信机构(IPC)允许在任意进程间大批量地交换数据。

本实验的目的是了解和熟悉LINUX支持的信号机制、管道机制、消息队列通信机制及共享存储区机制。

信号机制实验(一)【实验目的】1.了解什么是信号。

2.熟悉LINUX系统中进程之间软中断通信的基本原理。

【实验原理】利用signal来实现发送信号和接受信号的原理【实验内容】1.编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到父进程发来的信号后,分别输出下列信息后终止:Child process 1 is killed by parent!Child process 2 is killed by parent!父进程等待两个子进程终止后,输出以下信息后终止:Parent process is killed!<参考程序># include<># include<># include<>int wait_mark;void waiting(),sto p();void main(){ int p1, p2;signal(SIGINT,stop);while((p1=fork())==-1);if(p1>0) /*在父进程中*/{ ①while((p2=fork())= =-1);If(p2>0) /*在父进程中*/{ ②wait_mark=1;waiting(0);kill(p1,10);kill(p2,12);wait( );wait( );printf(“parent process is killed!\n”);exit(0);}else /*在子进程2中*/{wait_mark=1;signal(12,stop);waiting();lockf(1,1,0);printf(“child process 2 is killed by parent!\n”);lockf(1,0,0);exit(0);}}else /*在子进程1中*/{wait_mark=1;signal(10,stop);waiting();lockf(1,1,0);printf(“child process 1 is killed by parent!\n”);lockf(1,0,0);exit(0);}}void waiting(){while(wait_mark!=0);}void stop(){wait_mark=0;}实验要求:⑴运行程序并分析结果。

⑵如果把signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。

⑶该程序段前面部分用了两个wait(0),为什么?⑷该程序段中每个进程退出时都用了语句exit(0),为什么?信号机制实验(二)【实验目的】学习signal的函数的使用【实验原理】利用signal的函数的机制来实习我们发送截获信号的功能【实验内容】修改上面的程序,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),再观察程序执行时屏幕上出现的现象,并分析其原因。

<参考程序># include<># include<># include<>int pid1, pid2;int EndFlag=0;pf1=0;pf2=0;void IntDelete(){kill(pid1,10);kill(pid2,12);EndFlag=1;}void Int1(){printf(“child process 1 is killed by parent !\n”);exit(0);}void Int2(){printf(“child process 2 is killed by parent !\n”);exit(0);}main(){int exitcode;signal(SIGINT,SIG_IGN);signal(SIGQUIT,SIG_IGN);while((pid1=fork())==-1);if(pid1==0){signal(SIGUSR1,Int1);signal(SIGINT,SIG_IGN);pause();exit(0);}elsewhile((pid2=fork())= =-1);if(pid2==0){signal(SIGUSR2,Int2);signal(SIGINT,SIG_IGN);pause();exit(0);}else{signal(SIGINT,IntDelete);waitpid(-1,&exitcode,0); /*等待任何子进程中断或结束*/printf(“parent process is killed \n”);exit(0);}}}实验要求:运行程序并分析结果。

⑶司机售票员问题(选做题)编程用fork()创建一个子进程代表售票员,司机在父进程中,再用系统调用signal()让父进程(司机)捕捉来自子进程(售票员)发出的中断信号,让子进程(售票员)捕捉来自(司机)发出的中断信号,以实现进程间的同步运行。

管道通信实验(一)【实验目的】1、了解什么是管道2、熟悉UNIX/LINUX支持的管道通信方式【实验内容】编写程序实现进程的管道通信。

用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。

参考程序#include <>#include <>#include <>main( ){int fd[2];char outpipe[100],inpipe[100];pipe(fd); /*创建一个管道*/while ((pid1=fork( ))= =-1);if(pid1= =0){lockf(fd[1],1,0);sprintf(outpipe,"child 1 process is sending message!");/*把串放入数组outpipe中*/write(fd[1],outpipe,50); /*向管道写长为50字节的串*/sleep(5); /*自我阻塞5秒*/lockf(fd[1],0,0);exit(0);}else{while((pid2=fork( ))= =-1);if(pid2= =0){ lockf(fd[1],1,0); /*互斥*/sprintf(outpipe,"child 2 process is sending message!");write(fd[1],outpipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{ wait(0); /*同步*/read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/printf("%s/n",inpipe);wait(0);read(fd[0],inpipe,50);printf("%s/n",inpipe);exit(0);}}}五、运行结果延迟5秒后显示child 1 process is sending message!再延迟5秒child 2 process is sending message!管道通信实验(二)【实验目的】1、掌握有名管道的创建和读写方式2、熟悉UNIX/LINUX支持的有名管道通信方式【实验内容】1.创建有名管道2.本进程执行循环等待数据被写入到管道中并读有名管道3.打开有名管道并写数据到名管道参考代码:.);if ((fd = open(argv[1], O_RDONLY)) < 0){fprintf(stderr, "open fifo %s for reading failed: %s\n", argv[1], strerror(errno));exit(1);}fprintf(stdout, "open fifo %s for reading successed.\n", argv[0]);char buffer[BUFFER_SIZE];ssize_t n;while (1){again:n");break;}else{buffer[n] = '\0';fprintf(stdout, "read %d bytes from fifo: %s\n", n, buffer);}}return 0;}.);if ((fd = open(argv[1], O_WRONLY)) < 0){fprintf(stderr, "open fifo %s for writting failed: %s\n", argv[1], strerror(errno));exit(1);}fprintf(stdout, "open fifo %s for writting successed.\n", argv[0]);char buffer[BUFFER_SIZE];ssize_t n;n");}else{fprintf(stderr, "Error: open file failed: (errno = %d)%s\n", errno, strerror(errno));}exit(1);}off_t offset;offset = 1024;On error, the value MAP_FAILED (that is, (void*) -1) is returned, and errno is set appropriately. On success, munmap returns 0, on failure -1, and errno is set (probably to EINVAL).*//*PROT_EXEC Pages may be executed.PROT_READ Pages may be read.PROT_WRITE Pages may be written.PROT_NONE Pages may not be accessed.*/void *p;;On error, the value MAP_FAILED (that is, (void*) -1) is returned, and errno is set appropriately. On success, munmap returns 0, on failure -1, and errno is set (probably to EINVAL).*//*PROT_EXEC Pages may be executed.PROT_READ Pages may be read.PROT_WRITE Pages may be written.PROT_NONE Pages may not be accessed.*/void *p;1L3L4L4L2L3L4L3L1L3L4L2LserverReceive client1 message: i 'am client AReceive client2 message: ok! I have recieved your msg,I'm client B Receive client1 message: x[root@localhost root]#客户端A的运行结果如下:[root@localhost root]# ./client1input the msg to client2:i 'am client AReceive from client2, message: ok! I have recieved your msg,I'm client B input the msg to client2:xclient1 will quit![root@localhost root]#客户端B的运行结果如下:[root@localhost root]# ./client2Receive from client1, message: i 'am client Ainput the msg to client1: ok! I have recieved your msg,I'm client Bclient2 will quit![root@localhost root]#。

相关文档
最新文档