LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 632|回复: 1

请教一个关于信号和进程的问题

[复制链接]
发表于 2005-8-15 19:17:04 | 显示全部楼层 |阅读模式
//一个网络程序,用来学习进程同步的。
//问题:编译该程序并运行,有一个客户端连接时,通过ps -el,server只派生一个进程。
//但是,当客户端连接断开时,显示有5个甚至更多子进程退出。
//另外,是否调用sigemptymet,sigfillset,sigaddset函数时对运行结果并无影响。
//我是在fc1下编译的。
server
//server1.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<signal.h>
#include<wait.h>
#include<errno.h>

#define BUFSIZE 200
int pro_cli(int sockfd, struct sockaddr_in client_addr);
void sig_handler(int sig);
//void sig_handler2(int sig);
int main(int argc, char** argv)
{
    int listenfd,accfd;
    int i=0;
    char buf[BUFSIZE];
    struct sockaddr_in server_addr, client_addr;
   
    struct sigaction act,act2;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, SIGCHLD);
    act.sa_flags=0;
    act.sa_handler=sig_handler;
    //安装信号处理器
    if(sigaction(SIGCHLD, &act, NULL) <0)
    {
        perror("sigaction1 failed");
        exit(1);
    }*/

    printf("start create socket\n");
    if((listenfd=socket(AF_INET,SOCK_STREAM, 0))<0)
    {
        printf("socket error\n");
        exit(1);
    }
   
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port=htons(4455);
   
    printf("start bind socket\n");
    if(bind(listenfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr_in))<0)
    {
        printf("bind error\n");
        exit(1);
    }
   
    printf("start listen\n");
    listen(listenfd,1);
   
    socklen_t addr_len=sizeof(struct sockaddr_in);
for(;;)
    {
        accfd=accept(listenfd, (struct sockaddr*)&client_addr,&addr_len);

            if(fork()==0)//child
            {
                pro_cli(accfd, client_addr);
                exit(0);
   
            }
            
    }
    close(accfd);
}
int pro_cli(int sockfd, struct sockaddr_in client_addr)
{
    printf("start in child process\n");
    char buf[BUFSIZE];
    int num;
    while((num=recv(sockfd, buf, BUFSIZE, 0))>0)
    {
        printf("%s\n",buf);
        send(sockfd, buf, strlen(buf), 0);
    }
    printf("child exit\n");
}
void sig_handler(int sig)
{
    pid_t pid;
    int stat;
    if(sig==SIGCHLD)
    {
        printf("exit a child\n");
        while((pid = waitpid(-1,&stat, WNOHANG))>0)
        {
            printf("child %d terminated\n", pid);
            return;
        }
    }
}


client
//client1.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>

#define BUFSIZE 200

int main(char argc, char** argv)
{
    int connfd;
    struct sockaddr_in server_addr, client_addr;
    char buf[BUFSIZE];
    socklen_t addr_len;
   
    if (argc!=2)
    {
        printf("usage: %s IPaddress\n",argv[0]);
        exit(1);
    }
   
    printf("start create socket\n");
    if((connfd=socket(AF_INET, SOCK_STREAM, 0))<0)
    {
        printf("socket error\n");
        exit(1);
    }
    printf("cerate socket sucess\n");
   
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family=AF_INET;
    server_addr.sin_addr.s_addr=inet_addr(argv[1]);
    server_addr.sin_port=htons(4455);

   
    printf("start connect\n");
    if((connect(connfd,(struct sockaddr*)&server_addr, sizeof(server_addr)))==-1)
    {
        printf("connect error\n");
        exit(1);
    }

    printf("\nenter something\n");
    for(;;)
    {
        scanf("%s",buf);
        if(write(connfd,buf,200)>0)
        {
            read(connfd,buf,200);
        }
        printf(buf);
    }
}
发表于 2005-8-15 20:57:29 | 显示全部楼层
请用code功能保持代码缩进。没有缩进的代码很少有人愿意看。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表