|
|
//一个网络程序,用来学习进程同步的。
//问题:编译该程序并运行,有一个客户端连接时,通过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);
}
} |
|