Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263530
  • 博文数量: 51
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 606
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-13 16:43
文章分类

全部博文(51)

文章存档

2011年(1)

2010年(3)

2009年(45)

2008年(2)

我的朋友

分类: LINUX

2009-04-27 16:45:27

1.dup说明

 

#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);
        }
}

阅读(1218) | 评论(0) | 转发(0) |
0

上一篇:其它

下一篇:sftp 传文件无需密码设置

给主人留下些什么吧!~~