#include <unistd.h> int dup(int oldfd);//返回最小可用文件描述符 int dup2(int oldfd, int newfd);//返回指定可用文件描述符
|
成功返回文件描述符,否则失败返回-1.
参数 |
说明 |
oldfd |
被引用的文件描述符 |
newfd |
使用新的文件描述符,若已使用则先自动关闭 |
作用:类似引用性质的复制,对同一个信息不同句柄,但是一个关闭句柄,不影响另外一个使用.
目的:使得每个处理模块都是没有耦合,维护量小,方便,不需要应为有一点点bug就需要更新或编译整个主控程序。若有其他辅助机制,可以分配服务器压力,让交易直接在其他机器上运行。
2.例子:
/* ** 描述: 模块描述: 服务监控程序, 实时接受交易请求, 调度相应交易处理程序进行并发处理 */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <netdb.h> #include <errno.h> #include <memory.h> #include <unistd.h> main() { int cli;
int ls; int ifork; char cmd[10]; char buf[10]; struct sockaddr_in cliaddr_in; ls = createls(); if(ls < 0) { perror("建立侦听失败"); exit(0); } ...... ifork = fork( ); switch (ifork) { case -1: perror("fork 失败1 \n"); exit(1); case 0: signal(SIGCLD,SIG_IGN); for(;;) { addrlen = sizeof(struct sockaddr_in); cli = accept(ls,(struct sockaddr *)&cliaddr_in,(socklen_t *)&addrlen); if( cli == -1) { perror("connect 失败"); sleep(1); continue; } ifork = fork( ); switch(ifork) { case -1: perror("fork 失败"); sleep(1); break; case 0: close(ls); /* get the transaction code */ if(recv(cli,buf,9,MSG_PEEK) != 9) { perror("接收错误"); exit(1); } if(dup2(cli,512) != 512) //引用 { perror("dup 错误"); exit(1); } close(cli); sprintf(cmd,"proc%4.4s",buf+5); /* 执行交易处理(数据接收,处理,返回,这样每个程序都很小又独立,容易维护). */
/*
若有其他辅助机制,可以分配服务器压力,让交易直接在其他机器上运行。
*/
if (access(cmd,X_OK)==0) { execlp(cmd,cmd,"test",(char *)0); } else { printf("程序没有权限\n"); exit(1); } close(0); exit(1); default: close(cli); } } default: exit(0); } }
|
阅读(1252) | 评论(0) | 转发(0) |