传智扫地僧课程学习笔记。
上一节处理的是,
客户端主动关闭,
服务器进程没有关闭完的问题,
这一节的问题是,
服务器主动关闭,
由于客户端没有进程相关的处理,
所以ps 查看进程的时候,
会看到客户端的两个进程存在,
采取的方法,与之前一样,
运行的时候,客户端和服务器都有2个进程,一共加起来就是4个进程,
把服务器关掉后,4个进程都关掉了,这就是我们希望得到的结果,
只修改了客户端代码,
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
void handle( int num)
{
printf("recv num:%d\n", num);
exit( 0);
}
int main()
{
int sockfd = 0;
signal( SIGUSR1, handle);
sockfd = socket( PF_INET, SOCK_STREAM, 0);
if( sockfd == -1 )
{
perror(" fun socket\n");
exit(0);
}
struct sockaddr_in srvaddr;
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(8001);
srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if( connect( sockfd, ( struct sockaddr*)(&srvaddr), sizeof( srvaddr))<0)
{
perror("connect");
exit( 0);
}
int pid = 0;
pid = fork();
if( pid > 0)
{
//char revbuf[1024] = {0};
char sendbuf[1024] = {0};
while( fgets(sendbuf, sizeof(sendbuf), stdin)!=NULL)
{
write( sockfd, sendbuf, strlen(sendbuf));
//read( sockfd, revbuf, sizeof(revbuf));
//fputs( revbuf, stdout);
//memset( revbuf, 0, sizeof(revbuf));
memset( sendbuf, 0, sizeof(sendbuf));
}
}
else if( pid == 0)
{
char revbuf[1024] = {0};
int ret = 0;
while( 1)
{
ret = read( sockfd, revbuf, sizeof(revbuf));
if( ret<0)
{
printf("read error\n");
break;
}
else if( ret == 0)
{
printf("read error\n");
break;
}
fputs( revbuf, stdout);
memset( revbuf, 0, sizeof(revbuf));
}
kill( getppid(), SIGUSR1);
exit( 0);
}
close( sockfd);
return 0;
}
做服务器,要处理很多异常,
要跑一年,十年,都不挂掉,