实验三进程通信

合集下载

操作系统实验三进程的管道通信

操作系统实验三进程的管道通信

实验三进程的管道通信一、实验目的:(1)加深对进程概念的理解,明确进程和程序的区别;(2)学习进程创建的过程,进一步认识并发执行的实质;(3)分析进程争用资源的现象,学习解决进程互斥的方法;(4)学习解决进程同步的方法;(5)掌握Linux系统进程间通过管道通信的具体实现方法。

二、实验内容及要求:(1)使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话(写的内容自己定,但要有该进程的一些信息);(2)父进程从管道中读出来自两个子进程的消息,显示在屏幕上;(3)要求:父进程首先接收子进程p1发来的消息,然后再接收子进程p2发来的消息;(4)两个子进程要并发执行;(5)实现管道的互斥使用。

当一个子进程正在对管道进行写操作时,另一个欲写入管道的子进程必须等待。

使用系统调用lockf(fd[1],1,0)实现对管道的加锁操作,用lockf(fd[1],0,0)解除对管道的锁定;(6)实现父子进程的同步,当父进程试图从一空管道中读取数据时,便进入等待状态,直到子进程将数据写入管道返回后,才将其唤醒。

三、实现:相关的系统调用fork() 用于创一个子进程。

格式:int fork();返回值:在子进程中返回0;在父进程中返回所创建的子进程的ID值;当返回-1时,创建失败。

wait() 常用来控制父进程与子进程的同步。

在父进程中调用wait(),则父进程被阻塞,进入等待队列,等待子进程结束。

当子进程结束时,父进程从wait()返回继续执行原来的程序。

返回值:大于0时,为子进程的ID值;等于-1时,调用失败。

exit() 是进程结束时最常调用的。

格式:void exit( int status); 其中,status为进程结束状态。

pipe() 用于创建一个管道格式:pipe(int fd);其中fd是一个由两个数组元素fd[0]和fd[1]组成的整型数组,fd[0]是管道的读端口,用于从管道读出数据,fd[1]是管道的写端口,用于向管道写入数据。

实验三、进程通信(一) ——管道及共享内存

实验三、进程通信(一)          ——管道及共享内存
三、代码及运行结果分析
(1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析
实验代码:
#include<stdio.h>
main()
{ int x,fd[2];
char buf[30],s[30];
pipe(fd);
while ((x=fork())==-1);
if (x==0)
}
write(fe[1],s,30);
wait(0);
}
运行结果:
(3)阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享内存的情况,对两次的结果进行比较,并分析原因。最后用ipcrm命令删除自己建立的共享存储区。(有关ipcs和ipcrm介绍见后面一页)
addr=shmat(shmid,0,0);/*挂接,并得到共享区首地址*/
printf ("addr 0x%x\n",addr);
pint=(char *)addr;
for (i='a';i<='e';i++) *pint++=i;
pause();/*等待接收进程读*/
}
cleanup()
{
shmctl(shmid,IPC_RMID,0);
(2)每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),然后在另一个窗口中运行例3程序2,观察程序的运行结果并分析。运行结束后可以用ctrl+c结束程序1的运行。
(3)编写程序:使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序。要求在父进程中生成一个30字节长的私有共享内存段。接下来,设置一个指向共享内存段的字符指针,将一串大写字母写入到该指针指向的存贮区。调用fork()生成子进程,让子进程显示共享内存段中的内容。接着,将大写字母改成小写,子进程修改共享内存中的内容。之后,子进程将脱接共享内存段并退出。父进程在睡眠5秒后,在此显示共享内存段中的内容(此时已经是小写字母)。

实验三_进程间通信 (1)

实验三_进程间通信 (1)

实验三线程控制和进程间通信一、实验目的通过Linux管道通信机制、消息队列通信机制的使用,加深对不同类型的进程通信方式的理解。

二、实验内容:1.熟悉Linux的管道通信机制2.熟悉Linux的消息队列通信机制三、思考1.有名管道和无名管道之间有什么不同?2.管道的读写与文件的读写有什么异同?3.Linux消息队列通信机制中与教材中的消息缓冲队列通信机制存在哪些异同?四、实验指导<一>Linux管道通信机制管道是所有UNIX都提供的一种进程间通信机制,它是进程之间的一个单向数据流,一个进程可向管道写入数据,另一个进程则可以从管道中读取数据,从而达到进程通信的目的。

1.无名管道无名管道通过pipe()系统调用创建,它具有如下特点:(1)它只能用于具有亲缘关系的进程(如父子进程或者兄弟进程)之间的通信。

(2)管道是半双工的,具有固定的读端和写端。

虽然pipe()系统调用返回了两个文件描述符,但每个进程在使用一个文件描述符之前仍需先将另一个文件描述符关闭。

如果需要双向的数据流,则必须通过两次pipe()建立起两个管道。

(3)管道可以看成是一种特殊的文件,对管道的读写与文件的读写一样使用普通的read、write等函数,但它不是普通的文件,也不属于任何文件系统,而只存在于内存中。

2.pipe系统调用(1)函数原型#include <unistd.h>int pipe(int filedes[2]);(2)参数filedes参数是一个输出参数,它返回两个文件描述符,其中filedes[0]指向管道的读端,filedes[1]指向管道的写端。

(3)功能pipe在内存缓冲区中创建一个管道,并将读写该管道的一对文件描述符保存在filedes所指的数组中,其中filedes[0]用于读管道,filedes[1]用于写管道。

(4)返回值成功返回0;失败返回-1,并在error中存入错误码。

(5)错误代码EMFILE:进程使用的文件描述符过多ENFILE :系统文件表已满EFAULT :非法参数filedes3.无名管道的阻塞型读写管道缓冲区有4096B的长度限制,因此,采用阻塞型读写方式时,当管道已经写满时,写进程必须等待,直到读进程取走信息为止。

进程通讯管理实验报告(3篇)

进程通讯管理实验报告(3篇)

第1篇一、实验目的1. 理解进程通信的概念和原理;2. 掌握进程通信的常用机制和方法;3. 能够使用进程通信机制实现进程间的数据交换和同步;4. 增强对操作系统进程管理模块的理解。

二、实验环境1. 操作系统:Linux2. 编程语言:C3. 开发环境:GCC三、实验内容1. 进程间通信的管道机制2. 进程间通信的信号量机制3. 进程间通信的共享内存机制4. 进程间通信的消息队列机制四、实验步骤1. 管道机制(1)创建管道:使用pipe()函数创建管道,将管道文件描述符存储在两个变量中,分别用于读和写。

(2)创建进程:使用fork()函数创建子进程,实现父子进程间的通信。

(3)管道读写:在父进程中,使用read()函数读取子进程写入的数据;在子进程中,使用write()函数将数据写入管道。

(4)关闭管道:在管道读写结束后,关闭对应的管道文件描述符。

2. 信号量机制(1)创建信号量:使用sem_open()函数创建信号量,并初始化为1。

(2)获取信号量:使用sem_wait()函数获取信号量,实现进程同步。

(3)释放信号量:使用sem_post()函数释放信号量,实现进程同步。

(4)关闭信号量:使用sem_close()函数关闭信号量。

3. 共享内存机制(1)创建共享内存:使用mmap()函数创建共享内存区域,并初始化数据。

(2)映射共享内存:在父进程和子进程中,使用mmap()函数映射共享内存区域。

(3)读写共享内存:在父进程和子进程中,通过指针访问共享内存区域,实现数据交换。

(4)解除映射:在管道读写结束后,使用munmap()函数解除映射。

4. 消息队列机制(1)创建消息队列:使用msgget()函数创建消息队列,并初始化消息队列属性。

(2)发送消息:使用msgsnd()函数向消息队列发送消息。

(3)接收消息:使用msgrcv()函数从消息队列接收消息。

(4)删除消息队列:使用msgctl()函数删除消息队列。

实验三 进程间的通信

实验三 进程间的通信

实验三进程间的通信1、实验目的学习如何利用管道机制、消息缓冲队列进行进程间的通信,并加深对上述通信机制的理解。

2、实验内容(1)了解系统调用pipe()、msgget()、msgsnd()、msgrcv()的功能和实现过程。

(2)编写一段程序,使其用管道来实现父子进程之间的进程通信。

子进程向父进程发送自己的进程标识符,以及字符串“is sending a message to parent!”。

父进程则通过管道读出子进程发来的消息,将消息显示在屏幕上,然后终止。

(3)编写一段程序,使用消息缓冲队列来实现client进程和server进程之间的通信。

server进程先建立一个关键字为SVKEY (如75)的消息队列,然后等待接收类型为REQ(如1)的消息;在收到请求消息后,它便显示字符串“serving for client”和接收到的client进程的进程标识数,表示正在为client进程服务;然后再向client进程发送一应答消息,该消息类型是client 进程的进程标识数,而正文则是server进程自己的标识数。

client进程则向消息队列发送类型为REQ的消息(消息的正文为自己的进程标识数)以取得server进程的服务,并等待server 进程发来的应答;然后显示字符串“receive reply form”和接收到的server进程的标识符。

1、client.c2、server.c3、思考题上述通信机制各有什么特点?它们分别适合于何种场合?答:管道通信的特点:(1)管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;(2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);(3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。

(4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。

实验三进程间通信

实验三进程间通信

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

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

(一)信号机制实验目的1、了解什么是信号2、熟悉LINUX 系统中进程之间软中断通信的基本原理实验内容1、编写程序:用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c 键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process1 is killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!2、分析利用软中断通信实现进程同步的机理系统调用格式signal(sig,function)头文件为#include参数定义signal(sig,function)int sig;void (*func) ( )三、参考程序#include#include#includevoid waiting( ),stop( );int wait_mark;main( ){int p1,p2,stdout;while((p1=fork( ))= =-1); /*创建子进程p1*/if (p1>0){while((p2=fork( ))= =-1); /*创建子进程p2*/if(p2>0){wait_mark=1;signal(SIGINT,stop); /*接收到^c 信号,转stop*/ waiting( ); kill(p1,16); /*向p1 发软中断信号16*/kill(p2,17); /*向p2 发软中断信号17*/wait(0); /*同步*/wait(0);printf("Parent process is killed!\n");exit(0);}else{wait_mark=1;signal(17,stop); /*接收到软中断信号17,转stop*/ waiting( );lockf(stdout,1,0);printf("Child process 2 is killed by parent!\n");lockf(stdout,0,0);exit(0);}}else{wait_mark=1;signal(16,stop); /*接收到软中断信号16,转stop*/ waiting( );lockf(stdout,1,0);printf("Child process 1 is killed by parent!\n");lockf(stdout,0,0);exit(0);}}void waiting( ){while(wait_mark!=0);}void stop( ){wait_mark=0;}四、运行结果屏幕上无反应,按下^C 后,显示Parent process is killed!五、分析原因上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信号处。

实验三、进程通信一 ——管道及共享内存

实验三、进程通信一          ——管道及共享内存

操作系统实验报告实验三、进程通信(一)——管道及共享存一、实验目的1)加深对管道通信的了解2)掌握利用管道进行通信的程序设计3)了解共享存通信的程序设计方法4)了解和熟悉Linux支持的共享存储区机制二、实验容任务一、(1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析。

(2)编写程序:父进程利用管道将一字符串交给子进程处理。

子进程读字符串,将里面的字符反向后再交给父进程,父进程最后读取并打印反向的字符串。

任务二、(1)阅读例2的程序,运行一次该程序,然后用ipcs命令查看系统中共享存储区的情况,再次执行该程序,再用ipcs命令查看系统中共享存的情况,对两次的结果进行比较,并分析原因。

最后用ipcrm命令删除自己建立的共享存储区。

(有关ipcs和ipcrm介绍见后面一页)(2)每个同学登陆两个窗口,先在一个窗口中运行例3程序1(或者只登陆一个窗口,先在该窗口中以后台方式运行程序1),然后在另一个窗口中运行例3程序2,观察程序的运行结果并分析。

运行结束后可以用ctrl+c结束程序1的运行。

(3)编写程序:使用系统调用shmget(),shmat(),shmdt(),shmctl(),编制程序。

要求在父进程中生成一个30字节长的私有共享存段。

接下来,设置一个指向共享存段的字符指针,将一串大写字母写入到该指针指向的存贮区。

调用fork()生成子进程,让子进程显示共享存段中的容。

接着,将大写字母改成小写,子进程修改共享存中的容。

之后,子进程将脱接共享存段并退出。

父进程在睡眠5秒后,在此显示共享存段中的容(此时已经是小写字母)。

三、代码及运行结果分析(1)阅读以上父子进程利用管道进行通信的例子(例1),写出程序的运行结果并分析实验代码:#include<stdio.h>main(){ int x,fd[2];char buf[30],s[30];pipe(fd);while ((x=fork())==-1);if (x==0){close(fd[0]);printf("Child Process!\n");strcpy(buf,"This is an example\n");write(fd[1],buf,30);exit(0);}else{close(fd[1]);printf("Parent Process!\n");read(fd[0],s,30);printf("%s\n",s);}}运行结果:分析:调用pipe(fd);创建一个管道后,接着调用fork()函数产生两个进程,首先开始执行子进程,关闭管道出口,通过管道入口向管道中写入容。

Lab3--进程间通信

Lab3--进程间通信

进程间通信
一、实验目的
在本实验中,通过对生产者消费者算法的理解和实现,熟悉同步信号量以及互斥信号量的使用,并加深对进程间通信原理的理解。

二、实验内容
参考教材中的生产者消费者算法,创建5个进程,其中两个进程为生产者进程,3个进程为消费者进程。

要求如下:
1)一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。

2)3个消费者不断地从缓冲中读取一个字符并输出,其中一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品,消费者要消费的产品没有时,消费者进程被阻塞。

注意缓冲的管理。

3)为了使得程序的输出易于看到结果,分别在生产者和消费者进程的合适的位置加入一些随机睡眠时间。

三、思考题
1. 如何实现共享存储区互斥访问,如果没有对缓冲区实现互斥访问,会发生什
么现象?
2. 当对缓冲区的操作有多把锁时,如何避免死锁情况的发生?
3. 能否用上一次的实验中用到的记录锁实现对单一资源互斥访问?如果能,请
给出具体实现。

4. 能否采用信号机制实现进程间的同步与互斥?。

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

实验三进程通信一.实验学时与类型学时:2,课外学时:自定实验类型:设计性实验二.实验目的了解Linux的软中断、管道、消息队列、共享存储区等进程间通信方式。

三.实验容1. 软中断通信机制(1) 请编写一个程序:循环输出“how are you?”,在按下Ctrl+C后中断显示,输出“Byebye!”后退出程序。

#include<signal.h>#include<stdio.h>int k=1;void int_func(int sig) //软中断处理函数{ k=0; }Int main(){ signal(SIGINT,int_func);//预置软中断信号处理函数While(k==1)Printf(“how are you?\n”);Printf(“byebye!”);}(2)使用信号机制实现父子进程同步,父进程先输出A,然后子进程输出B。

#include<signal.h>#include<stdio.h>int k=1;void func(int sig) { k=0; }main(){ int pid;pid=fork();if(pid>0){ printf(“A\n”);kill(pid,12);}else if(pid==0){ signal(12,func);while(k==1)sleep(1);printf(“B\n”);}}2. 管道机制(1) 父子进程通过管道传送一串字符。

要求:子进程随机从键盘输入一串字符,通过管道发给父进程,父进程从管道中将消息读出并显示出来。

#include<stdio.h>#include<unistd.h>main(){ int pid, fd[2] ;char outpipe[50], inpipe[50];pipe(fd);pid=fork();if (pid==0){Printf(“please input some message:\n”);Fgets(inpipe,sizeof(inpipe),stdin);write(fd[1],inpipe,50);}else if (pid>0);{ wait(0);Printf(“father get this message:\n”);read(fd[0],outpipe,50);printf(“%s\n”,outpipe);}}(2)父子进程通过管道互相发送字符串。

要求:子进程向父进程通过管道发送”I am child.”,父进程回送”I am father.”,父子进程将各自收到的字符串显示在屏幕上。

#inlcude<stdio.h>#include<unistd.h>#include<string.h>main(){ int pid, fd[2] ;char str1[50], str2[50];pipe(fd);pid=fork();if (pid==0){ strcpy(str1,”I’m child”);write(fd[1],str1,strlen(str1));Sleep(1);read(fd[0],str2,50);printf(“Child received: %s\n”,str2);}else if (pid>0){ read(fd[0],str1,50);printf(“Parent received:%s\n”,str1);strcpy(str2,”I’m father.”);write(fd[1],str2,strlen(str2));}}3. 消息队列机制(1) 父进程及其子进程通过一条消息队列互相传送数据。

#include<stdio.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>int msgqid,qid;struct msg{ long mtype;char mtext[256];}pmsg;cancelqueue(){ msgctl(msgqid,IPC_RMID,0);exit(0);}main(){ int pid;Pid=fork();If (pid>0){ msgqid=msgget(75, 0777);printf(“msg id: %d\n”,msgqid);pmsg.mtype=1;*((int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“A:receive msg from %d\n",*((int *)pmsg.mtext)); }Else if(pid==0){ signal(2,cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1){ msgrcv(msgqid,&pmsg,256,1,0);qid=*(int *)pmsg.mtext;printf(“B:receive msg from %d\n”,qid);pmsg.mtype=qid;*((int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);}}}(2) 非父子进程之间实通过一条消息队列互相传递数据。

A进程:#include<stdio.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>struct msg{ long mtype;char mtext[256];}pmsg;main(){ int msgqid,pid;msgqid=msgget(75, 0777);printf(“msg id: %d\n”,msgqid);pmsg.mtype=1;*((int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);msgrcv(msgqid,&pmsg,256,getpid(),0);printf(“A:receive msg from %d\n”,*((int *)pmsg.mtext)); }B进程:#include<stdio.h>#include<sys/ipc.h>#include<sys/msg.h>#include<sys/types.h>int msgqid,pid;struct msg{ long mtype;char mtext[256];}pmsg;cancelqueue(){ msgctl(msgqid,IPC_RMID,0);exit(0);}main(){ signal(2,cancelqueue);msgqid=msgget(75, 0777|IPC_CREAT);while(1){ msgrcv(msgqid,&pmsg,256,1,0);pid=*(int *)pmsg.mtext;printf(“B:receive msg from %d\n”,pid);pmsg.mtype=pid;*((int *)pmsg.mtext)=getpid();msgsnd(msgqid,&pmsg,sizeof(int),0);}}4. 共享存机制(1) 编程实现基于共享存的进程间通信。

要求:进程A通过共享存将自己的进程号传递给进程B。

A:#include<stdio.h>#include<sys/shm.h>main(){ int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int *)shmat(shmid, 0,0);*va=getpid();printf(“get A’s pid:%d\n”,*va);shmdt(va);}B:#include<stdio.h>#include<sys/shm.h>main(){ int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int*)shmat(shmid, 0,0);printf(“A’s pid is :%d\n”,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);}(2) 若要通过共享存实现进程A与进程B互送进程号,可怎样编程实现?A:#include<stdio.h>#include<sys/shm.h>main(){ int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int *)shmat(shmid, 0,0);*va=getpid();printf(“get A’s pid:%d\n”,*va);Sleep(2);printf(“B’s pid is:%d\n”,*va)shmdt(va)}B:#include<stdio.h>#include<sys/shm.h>main(){ int shmid;int *va;shmid=shmget(22,sizeof(*va),0666|IPC_CREAT);va=(int*)shmat(shmid, 0,0);printf(“A’s pid is :%s\n”,*va);*va=getpid();printf(“get B’s pid:%d\n”,*va);shmdt(va);shmctl(shmid,IPC_RMID,0);}5. SOCKET进程通信(选做)编程实现基于SOCKET的进程间通信,通过网络实现进程之间数据通信。

要求:分别编写服务器端和客户端方程序,运行于不同终端,二者可相互进行通信。

Server:#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>int main(){int server_sockfd = -1;int client_sockfd = -1;int client_len = 0;struct sockaddr_in server_addr;struct sockaddr_in client_addr;//创建流套接字server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//设置服务器接收的连接地址和监听的端口server_addr.sin_family = AF_INET;//指定网络套接字server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//接受所有IP地址的连接server_addr.sin_port = htons(9736);//绑定到9736端口//绑定(命名)套接字bind(server_sockfd,(struct sockaddr*)&server_addr, sizeof(server_addr));//创建套接字队列,监听套接字listen(server_sockfd, 5);//忽略子进程停止或退出信号signal(SIGCHLD, SIG_IGN);while(1){char ch = '\0';client_len = sizeof(client_addr);printf("Server waiting\n"); //接受连接,创建新的套接字client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_addr, &client_len);if(fork() == 0){//子进程中,读取客户端发过来的信息,处理信息,再发送给客户端read(client_sockfd, &ch, 1);sleep(5);ch++;write(client_sockfd, &ch, 1);close(client_sockfd);exit(0);}else{//父进程中,关闭套接字close(client_sockfd);}}}Client:#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <stdlib.h>int main(){int sockfd = -1;int len = 0;struct sockaddr_in address;int result;char ch = 'A'; //创建流套接字sockfd = socket(AF_INET, SOCK_STREAM, 0); //设置要连接的服务器的信息address.sin_family = AF_INET;//使用网络套接字address.sin_addr.s_addr = inet_addr("127.0.0.1");//服务器地址address.sin_port = htons(9736);//服务器所监听的端口len = sizeof(address);//连接到服务器result = connect(sockfd, (struct sockaddr*)&address, len);if(result == -1){perror("ops:client\n");exit(1);}//发送请求给服务器write(sockfd, &ch, 1);//从服务器获取数据read(sockfd, &ch, 1);printf("char form server = %c\n", ch);close(sockfd);exit(0);}四.思考与总结(1) 请对比下列程序与实验1(1)在按下Ctrl+C之后的运行现象。

相关文档
最新文档