首页 > 系统 > 关键词 > linux服务器最新资讯 > 正文

Linux系统下实现多线程客户/服务器

2008-09-25 17:50 · 稿源:互联网
在传统的Unix模型中,当一个进程需要由另一个实体执行某件事时,该进程派生(fork)一个子进程,让子进程去进行处理。Unix下的大多数网络服务器程序都是这么编写的,即父进程接受连接,派生子进程,子进程处理与客户的交互。虽然这种模型很多年来使用得很好,但是fork时有一些问题:1.fork是昂贵的。内存映像要从父进程拷贝到子进程,所有描述字要在子进程中复制等等。目前有的Unix实现使用一种叫做写时拷贝(copy-on-write)的技术,可避免父进程数据空间向子进程的拷贝。尽管有这种优化技术,fork仍然是昂贵的。2.fork子进程后,需要用进程间通信(IPC)在父子进程之间传递信息。Fork之前的信息容易传递,因为子进程从一开始就有父进程数据空间及所有描述字的拷贝。但是从子进程返回信息给父进程需要做更多的工作。线程有助于解决这两个问题。线程有时被称为轻权进程(lightweightprocess),因为线程比进程“轻权”,一般来说,创建一个线程要比创建一个进程快10~100倍。一个进程中的所有线程共享相同的全局内存,这使得线程很容易共享信息,但是这种简易性也带来了同步问题。一个进程中的所有线程不仅共享全局变量,而且共享:进程指令、大多数数据、打开的文件(如描述字)、信号处理程序和信号处置、当前工作目录、用户ID和组ID。但是每个线程有自己的线程ID、寄存器集合(包括程序计数器和栈指针)、栈(用于存放局部变量和返回地址)、error、信号掩码、优先级。在Linux中线程编程符合Posix.1标准,称为Pthreads。所有的pthread函数都以pthread_开头。以下先讲述5个基本线程函数,在调用它们前均要包括pthread.h头文件。然后再给出用它们编写的一个TCP客户/服务器程序例子。第一个函数:
intpthread_create(pthread_t*tid,constpthread_attr_t*attr,void*(*func)(void*),void*arg);
一个进程中的每个线程都由一个线程ID(threadID)标识,其数据类型是pthread_t(常常是unsignedint)。如果新的线程创建成功,其ID将通过tid指针返回。

每个线程都有很多属性:优先级、起始栈大小、是否应该是一个守护线程等等,当创建线程时,我们可通过初始化一个pthread_attr_t变量说明这些属性以覆盖缺省值。我们通常使用缺省值,在这种情况下,我们将attr参数说明为空指针。最后,当创建一个线程时,我们要说明一个它将执行的函数。线程以调用该函数开始,然后或者显式地终止(调用pthread_exit)或者隐式地终止(让该函数返回)。函数的地址由func参数指定,该函数的调用参数是一个指针arg,如果我们需要多个调用参数,我们必须将它们打包成一个结构,然后将其地址当作唯一的参数传递给起始函数。在func和arg的声明中,func函数取一个通用指针(void*)参数,并返回一个通用指针(void*),这就使得我们可以传递一个指针(指向任何我们想要指向的东西)给线程,由线程返回一个指针(同样指向任何我们想要指向的东西)。调用成功,返回0,出错时返回正Exxx值。Pthread函数不设置errno。第二个函数:
intpthread_join(pthread_ttid,void**status);
该函数等待一个线程终止。把线程和进程相比,pthread_creat类似于fork,而pthread_join类似于waitpid。我们必须要等待线程的tid,很可惜,我们没有办法等待任意一个线程结束。如果status指针非空,线程的返回值(一个指向某个对象的指针)将存放在status指向的位置。第三个函数:
pthread_tpthread_self(void);
线程都有一个ID以在给定的进程内标识自己。线程ID由pthread_creat返回,我们可以pthread_self取得自己的线程ID。第四个函数:
intpthread_detach(pthread_ttid);
线程或者是可汇合的(joinable)或者是脱离的(detached)。当可汇合的线程终止时,其线程ID和退出状态将保留,直到另外一个线程调用pthread_join。脱离的线程则像守护进程:当它终止时,所有的资源都释放,我们不能等待它终止。如果一个线程需要知道另一个线程什么时候终止,最好保留第二个线程的可汇合性。Pthread_detach函数将指定的线程变为脱离的。该函数通常被想脱离自己的线程调用,如:pthread_detach(pthread_self());

#p#分页标题#e#第五个函数:
voidpthread_exit(void*status);
该函数终止线程。如果线程未脱离,其线程ID和退出状态将一直保留到调用进程中的某个其他线程调用pthread_join函数。指针status不能指向局部于调用线程的对象,因为线程终止时这些对象也消失。有两种其他方法可使线程终止:1.启动线程的函数(pthread_creat的第3个参数)返回。既然该函数必须说明为返回一个void指针,该返回值便是线程的终止状态。2.如果进程的main函数返回或者任何线程调用了exit,进程将终止,线程将随之终止。以下给出一个使用线程的TCP回射客户/服务器的例子,完成的功能是客户端使用线程给服务器发从标准输入得到的字符,并在主线程中将从服务器端返回的字符显示到标准输出,服务器端将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程。利用该程序框架,通过扩展客户端和服务器端的处理功能,可以完成多种基于多线程的客户机/服务器程序。该程序在RedHat6.0和TurboLinux4.02下调试通过。共用头文件如下:(head.h)
#include#include#include#include#include#include#include#include#include#include#include#defineMAXLINE1024#defineSERV_PORT8000#defineLISTENQ1024staticintsockfd;staticFILE*fp;
公用函数如下(common.c):
/*从一个描述字读文本行*/ssize_treadline(intfd,void*vptr,size_tmaxlen){ssize_tn,rc;charc,*ptr;for(n=1;n0){if((nwritten=write(fd,ptr,nleft))<=0){if(errno==EINTR)nwritten=0;elsereturn(-1);}nleft-=nwritten;ptr++=nwritten;}
客户端主程序如下:(client.c)
#include“head.h";#include“common.c";/*在str_cli中定义的要被线程执行的函数*/void*copyto(void*arg){charsendline[MAXLINE];while(fgets(sendline,MAXLINE,fp)!=NULL)writen(sockfd,sendline,strlen(sendline));shutdown(sockfd,SHUT_WR);return(NULL);}voidstr_cli(FILE*fp_arg,intsockfd_arg){charrecvline[MAXLINE];pthread_ttid;sockfd=sockfd_arg;fp=fp_arg;pthread_creat(&tid,NULL,copyto,NULL);while(readline(sockfd,recvline,MAXLINE)>0)----fputs(recvline,stdout);}intmain(intargc,char**argv){intsockfd;structsockaddr_inservaddr;if(argc!=2)printf(“usage:tcpcli");exit(0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sinport=htons(SERV_PORT);inet_pton(AF_INET,argv[1],&servaddr.sin_addr);connect(sockfd,(structsockaddr*)&servaddr,siziof(servaddr));str_cli(stdin,sockfd);exit(0);}

#p#分页标题#e#服务器端主程序如下:
#include“head.h";#include“common.c";voidstr_echo(intsockfd){ssize_tn;charline[MAXLINE];for(;;){if((n=readline(sockfd,line,MAXLINE))==0)return;writen(sockfd,line,n);}}staticvoid*doit(void*arg){pthread_detach(pthread_self());str_echo((int)arg);close((int)arg);return(NULL);}intmain(intargc,char**argv){intlistenfd,connfd;socklen_taddrlen,len;structsockaddr_incliaddr,servaddr;pthread_ttid;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero(&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=SERV_PORT;bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr));listen(listenfd,LISTENQ);addrlen=sizeof(cliaddr);cliaddr=malloc(addrlen);for(;;){len=addrlen;connfd=accept(listenfd,(structsockaddr*)&cliaddr,&len);pthread_creat(&tid,NULL,&doit,(void*)connfd);}}

上一页[1][2][3]

  • 相关推荐
  • 大家在看
  • linux系统入门用什么书好

    有朋友问我为何学习Linux,其实我刚开始学习时也有这个疑问,不知道它的用处何在,它的优点何在,就会有这样的疑问,只是看到好多人都在学习,很好奇,自己也想学一下,但又不知道为何要学它。后来我就在网上和图书馆找Linux相关的知识和书籍,对其知识有了全面的了解后决定是不是要学习,就不会盲目跟风,明白自己为何要学习是很重要的。言归正传,为何要学习Linux呢,首先了解一下Linux,它是一套可以供大家免费使用的类Unix操作

  • linux系统入门用什么书好

    有朋友问我为何学习Linux,其实我刚开始学习时也有这个疑问,不知道它的用处何在,它的优点何在,就会有这样的疑问,只是看到好多人都在学习,很好奇,自己也想学一下,但又不知道为何要学它。后来我就在网上和图书馆找Linux相关的知识和书籍,对其知识有了全面的了解后决定是不是要学习,就不会盲目跟风,明白自己为何要学习是很重要的。言归正传,为何要学习Linux呢,首先了解一下Linux,它是一套可以供大家免费使用的类Unix操作

  • Win10新预览版19645推送:修复中文输入法无法切换、Linux内核从镜像剥离

    今晨,微软面向快速通道(Fast Ring)的Insider会员推送新预览版,操作系统版本号Build 19645。经查,Build 19645属于mn_release分支,在微软切换到rs_prerelease之前,我们的确很难看到新功能

  • 最强蜗牛服务器无响应详细解决办法 三种办法解决服务器无响应

    最强蜗牛经常的会碰到服务器无响应的情况,那么遇到这样的情况怎么办呢?下面就来为大家分享一下最强蜗牛服务器无响应详细解决办法。

  • Xbox智能分发是什么 Smart Delivery有哪些服务

    微软游戏业务部门Xbox在近日公布了一个全新的服务——智能分发(Smart Delivery),这一个将上一代主机游戏延续到次世代主机的服务,具体服务内容是什么呢,我们来一起看下。

  • 外媒:英伟达AMD服务器芯片销量正在增加

    【TechWeb】6月30日消息,据国外媒体报道,数据中心、云计算等领域的需求,也带动了服务器销量的增长,进而也拉升了服务器相关芯片销量的提升。外媒在最新的报道中就表示,英伟达、AMD这两大厂商服务器芯片的销量,正在增加,他们对未来也非常乐观。英伟达服务器相关芯片的业绩,在他们的财报中体现在数据中心这一业务上,这一业务2020财年的营收为29.83亿美元,在英伟达营收中所占的比重,由上一财年的25%提升到了27.4%。而在截?

  • AppClips是什么功能 AppClips怎么使用

    苹果iOS14系统中加入了一个全新的AppClips功能,这个功能是可以让用户不下载全部应用的情况下就可以使用该应用的功能,那么AppClips是怎么使用,这里我们来了解下AppClips功能的介绍。

  • 周杰伦新单曲《Mojito》导致QQ音乐服务器崩溃

    DoNews 6月12日消息(记者 刘文轩)今天凌晨,周杰伦最新单曲《Mojito》在QQ音乐、酷狗音乐、酷我音乐上线。上线后不久,QQ音乐服务器似乎开始出现崩溃的情况,有用户在QQ音乐官方微博下留言反馈了这一情况。从用户发布的截图可以看出,用户在付费购买这张单曲的时候,会被提示“购买过程中由于网络异常导致失败,系统未扣费,请尝试重新购买”。这并不是周杰伦第一次把QQ音乐搞到崩溃,早在去年9月,周杰伦的单曲《说好不哭》上线

  • 2个月构建一个Go服务器,他通过众筹获得14万元

    Kaya.gs是使用Go语言构建的一个服务器,它的创始人Gabriel Benmergui仅用 2 个月的时间就完成该产品的构建及启动,并在随后几个月的时间内容通过众筹活动筹集了 2 万美元。然而,投入运行 1 年后,Kaya.gs就被迫关闭了。

  • Redmi 9在海外率先发布:搭载联发科Helio G80处理器

    【TechWeb】经过了一段时间的密集曝光,昨天,全新的Redmi 9新机在西班牙正式发布了。外观方面,全新的Redmi 9采用的是一块6.53英寸19.5:9LCD水滴屏,分辨率为2340x1080,最高亮度400尼特,采用康宁大猩猩三代玻璃,背部延续中式圆造型,整合了拍照和后指纹模块,后置四摄相机模组。机身三围163.32 × 77.01 × 9.1 mm,重量为198g,提供灰色、绿色和紫色三种配色可选。配置方面,全新的Redmi 9搭载联发科Helio G80处理器,基于12

  • 感天动地却终究没法感动你!买199台服务器也没能让一个土豪脱单

    从前有一个年轻的土豪,他喜欢看直播,看美女,大学没读完就在家天天刷DOUYIN,家里怕他出去调皮。。这一天,他突然觉得无聊了,觉得这样每天打赏下去,就算不会坐吃山空,也会要么被主播害死,要么被老爸打死。于是他想做点什么正经事情了。他想多认识年轻漂亮的女孩,他渴望交友,于是他想做个交友的APP。比如MOMO这样的。做个APP,需要办执照,注册公司,办ICP,等等。他找来了平时的酒肉朋友,朋友告他除了办这些证照外,还需?

  • 猿辅导招聘服务器端研发工程师(JAVA)诚邀技术大拿

    猿辅导是一家在线教育领域的互联网公司,众所周知互联网公司最重要的岗位非程序员莫属,猿辅导也不例外,近日猿辅导招聘服务器端研发工程师(JAVA)正如火如荼的进行着。猿辅导可以为工程师们提供舒适的工作环境以便大家可以大显身手。猿辅导望京办公楼猿辅导的这份工作主要内容是负责猿辅导主app相关产品服务器端的开发,而且作为一名有经验的研发工程师,你还需要指导新人进行开发。猿辅导的办公环境对于这个岗位,猿辅导有相应?

  • 华为发布新一代智能服务器,携手英特尔加速智能计算前行

    今天,华为在深圳发布了新一代FusionServer Pro V6 智能服务器,首款推出FusionServer Pro 2488H V6 四路机架服务器。相比上一代FusionServer Pro V5 搭配的第二代英特尔?至强?可扩展处理器,新一代FusionServer Pro V6 搭配了第三代英特尔?至强?可扩展处理器,并支持最新英特尔?傲腾?持久内存。 自 2019 年华为将FusionServer服务器全面升级为FusionServer Pro智能服务器以来,该产品线已连续推出两代新品,华为一直紧跟英特尔技

  • 制造商消息人士:云服务器需求未来一年半依旧强劲

    6月3日消息,据国外媒体报道,智能手机等诸多产品及服务的出货量和市场需求都受到了影响,但笔记本电脑、处理器、在线教育、云计算等产品和服务的需求,却有一定程度的提升。外媒最新的报道显示,云服务器也是需求有增长的一个领域,需求依旧强劲,未来一段时间的出货量也将高速增长。外媒是援引服务器制造领域消息人士透露的消息,报道云服务器需求强劲、出货辆将高速增长的。这一服务器制造领域的消息人士表示,云服

  • LOL新英雄Lillia什么时候出 莉莉娅新游戏上线时间

    在LOL测试服中出现了一个新的英雄名字“Lillia”(暂译:莉莉娅),目前有关这个英雄的信息还十分少,不少玩家很期待这个英雄什么时候会推出,这里我们来看下莉莉娅英雄的上线时间。

  • 浪潮发布了两款M6系列四路服务器,支持最新的第三代Intel Xeon可扩展处理器

    [TechWeb]全球领先的IT基础架构提供商浪潮(Inspur)发布了两款M6系列四路服务器,支持最新的第三代Intel Xeon可扩展处理器,其中包括针对云方案进行了优化的2U四路服务器NF8260M6和四路4U四路服务器NF8480M6。传统企业客户的关键任务应用场景的服务器。第三代Intel Xeon可扩展处理器支持四路和八路服务器,单个CPU最多可支持28个内核。主流CPU首次支持Bfloat16数字格式,以增强AI深度学习性能和计算速度。同时,在云计算,内存数

  • 联想“关键先生”闪亮登场,全新四路服务器加速企业智能化转型

    联想企业科技集团于今日正式推出ThinkSystem SR850 V2 和SR860 V2 两款四路服务器。作为联想ThinkSystem系列最新的高端产品,全新升级至英特尔第三代至强可扩展处理器的SR850 V2 和SR860 V2 能凭借无与伦比的性能、扩展性和可靠性为企业的智能化转型开拓全新路径。在“新基建”引发的智能化转型大潮中,对数据的分析、处理和利用已经成为企业在当下和未来取得成功的重要因素,再加上数据量爆炸式增长的现状,让企业对服务器产品提?

  • IDC:全球通用服务器厂商一季度收入为168.4亿美元

    日前,IDC发布了《 2020 年第 1 季度全球x86 服务器市场追踪报告》。报告显示,一季度,全球通用服务器厂商收入为168. 4 亿美元,同比下降9.1%,出货量为 250 万台,同比下降0.2%。戴尔、HPE和浪潮仍占据市场前三把交椅。

  • 助力中小型企业 联想企业科技集团推出ThinkServer TS80X服务器

    6 月 10 日,联想企业科技集团宣布推出新款塔式服务器Lenovo ThinkServer TS80X,持续以客户为中心赋能中小企业数字化转型。作为联想ThinkServer家族的最新成员,TS80X将完整强悍的服务能力精炼至18.5L的小巧身材中,旨在以最高性价比成为中小企业客户入门级服务器的不二之选。联想ThinkServer TS80X塔式服务器中小企业成中国经济脊梁 数字化转型助力度过难关在中国,中小企业的地位正变得越来越重要,数据显示,目前我国的中小企?

  • 戴森全新Digital Slim轻量无绳吸尘器全球首发——轻量科技,性能不妥协

    今日,戴森Digital Slim轻量无绳吸尘器于中国市场全球首发。它是戴森无绳吸尘器中重量最轻的一款产品,搭配吸头后仅重1. 5 千克,重量减轻30%、体积减小20%,性能却依旧强劲。作为一款专为中国家庭设计的产品,戴森Digital Slim轻量无绳吸尘器经过了大量的居家环境测试,能够满足中国消费者高频率、深层次、全方位的日常清洁需求,轻松吸除家中的大小颗粒和看不见的微尘与过敏原。戴森全新Digital Slim轻量无绳吸尘器全球首发戴森?

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议