网站大量收购闲置独家精品文档,联系QQ:2885784924

5并发服务器(8-9)new.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并发服务器 服务器分类 进程与线程 多进程服务器 多线程服务器 服务器分类 按连接类型分类 面向连接的服务器(如tcp) 面向无连接的服务器(如udp) 按处理方式分类 迭代服务器 并发服务器 迭代服务器 vs. 并发服务器 TCP套接字编程 --服务器程序模板 int main(void) { int sockfd,connect_sock; if((sockfd= socket (AF_INET,SOCK_STREAM,0))==-1) { perror(“create socket failed.”); exit(-1); } /* bind sockfd to some address */ /* listen */ …… loop { if((connect_sock= accept (sockfd,NULL,NULL))==-1) { perror(“Accept error.”); exit(-1); } /* read and process request */ close (connect_sock); } close (sockfd); } 创建进程 #include sys/types.h #include unistd.h pid_t fork(void) 返回:父进程中返回子进程的进程ID, 子进程返回0,-1-出错 fork后,父子进程共享数据空间、代码空间、堆栈、所有的文件描述字; 如果父子进程同时对同一文件描述字操作,而又没有任何形式的同步,则会出现混乱的状况; 非常重要的是:fork后,父子进程均需要将自己不使用的描述字关闭,有两方面的原因: (1)以免出现不同步的情况; (2)最后能正常关闭描述字 终止进程 进程的终止存在两个可能: 父进程先于子进程终止(init进程) 子进程先于父进程终止 对于后者,系统内核为子进程保留一定量的状态信息:进程ID、终止状态、CPU时间等;当父进程调用wait或waitpid函数是,获取这些信息; 当子进程终止时,向父进程发送SIGCHLD信号;缺省情况下,父进程忽略该信号。 终止进程 #include stdlib.h void exit(int status); 本函数终止调用进程。 关闭所有子进程打开的描述符 释放占用的内存资源 并向父进程发送SIGCHLD信号。 获取子进程终止信息 #include sys/types.h #include sys/wait.h pid_t wait(int *stat_loc); 返回:终止子进程的ID-成功;-1-出错; 进程的返回值; 该函数将挂起当前进程,直到有一个子进程终止或者被信号中断。 当调用该系统调用时,如果有一个子进程已经终止,则该系统调用立即返回,并释放子进程所有资源。 获取子进程终止信息(续) pid_t waitpid(pid_t pid, int *stat_loc, int option); 返回:终止子进程的ID-成功;-1-出错;stat_loc存储子进程的返回值; 当pid=-1,option=0时,该函数等同于wait,否则由参数pid和option共同决定函数行为,其中pid参数意义如下: -1:要求知道任何一个子进程的返回状态; 0:要求知道进程号为pid的子进程的状态; =0:要求知道进程组号等于当前进程的进程组号的任一进程的状态。 -1:要求知道进程组号为pid的绝对值的任一子进程状态。 进程举例 pid_t pid; if ((pid=fork()) 0) /* 父进程 */ { int child_status; waitpid(pid, child_status, 0); } else if ( pid == 0 ) { /* 子进程 */ exit(0); } else { /* 创建错误 */ printf(“fork error.\n”); exit(1); } 多进程并发服务器模板 …… int main(void) { int listenfd, connfd; pid_t pid; int BACKLOG = 5; if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror(“Create socket failed.”); exit(1); } bind(listenfd, …); listen(listenfd, BACKLOG); while(1) { if ((connfd = accept(sockfd, NULL, NULL)) == -1) { perror(“Accept error.”); exit(1); } 多进程并发服务器模板(续)

文档评论(0)

junjun37473 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档