|

楼主 |
发表于 2007-1-23 21:27:07
|
显示全部楼层
我添加了信号处理及io复用后,测试结果是信号确实会产生,然后程序终止,但是按要求产生信号后,只需提示一下即可,然后程序继续运行,我不知道这个处理函数怎么写,好象handler怎么写也会不到upload函数中让它继续运行呀(现在是捕捉到信号后,不停地打印handler中的printf,然后终止了):
- 1 void handler(){printf("error caused by signal\n");}
- 2 int upload(){
- 3 int f;//文件标识符
- 4 size_t rsize;//读取长度
- 5 struct stat buffer;//结构,用来取得文件大小
- 6 unsigned char buf[1024+1];//缓冲区
- 7 struct sockaddr_in servaddr;
- 8 int ret;
- 9 struct timeval timeout;
- 10 fd_set rfd,wfd,efd;
- 11 struct sigaction newact;
- //初始化套接口,hostname和port是经过参数初始化了的服务器ip和端口
- 12 servaddr.sin_family=AF_INET:
- 13 servaddr.sin_port=htons(port);
- 14 if(inet_pton(AF_INET,hostname,&servaddr.sin_addr)<=0){
- 15 perror("inet_pton");
- 16 }
- 17 fcntl(sockfd,F_SETFD,O_NONBLOCK);
- 18 timeout.tv_sec=2;
- 19 timeout.tv_usec=0;
- 20 newact.sa_flags=0;
- 21 sigemptyset(&newact.sa_mask);
- 22 sigaddset(&newact.sa_mask,SIGPIPE);
- 23 sigaddset(&newact.sa_mask,SIGSEGV);
- 24 if(sigaction(SIGPIPE,&newact,NULL)<0){
- 25 printf("sigsegv output info\n");
- 26 }
- 27 if(sigaction(SIGSEGV,&newact,NULL)<0){
- 28 printf("sigpipe output info\n");
- 29 }
- 30 while(1){
- 31 stat(filename,&buffer);//取得文件属性
- //打开文件
- 32 if((f=open("filename",O_RDONLY))<0){
- 33 perror("can't open file");
- 34 continue;
- 35 }
- //生成套接口
- 36 if(sockfd=socket(AF_INET,SOCK_STREAM,0)<0){
- 37 perror("socket");
- 38 close(f);
- 39 continue;
- 40 }
- //连接服务器
- 41 if(connect(sockfd,(struct sockaddr *)&seraddr,sizeof(struct sockaddr))<0) {
- 42 perror("connect");
- 43 close(f);
- 44 close(sockfd);
- 45 continue;
- 46 }
- 47 resize=buffer.st_size;//文件大小
- 48 FD_ZERO(&rfd);
- 49 FD_ZERO(&wfd);
- 50 FD_ZERO(&efd);
- 51 FD_SET(f,&rfd);
- 52 FD_SET(sockfd,&wfd);
- 53 FD_SET(sockfd,&efd);
- 54 ret=select(sockfd+1,&rfd,&wfd,&efd,&timeout);
- 55 if(ret==0)
- 56 continue;
- 57 if(ret<0){
- 58 perror("select error:");
- 59 exit(-1);
- 60 }
- 61 alarm(3);
- 62 if(FD_ISSET(f,&rfd)&&FD_ISSET(sockfd,&wfd)){
- 63 while(rsize>0){
- 64 resize -=readn(f,buf,1024);//readn()函数是经过封装了read函数能准确读一定字节文件的函数
- 65 writen(sockfd,buf,1024);//和readn函数一样封装过write函数
- 66 }
- 67 }
- 68 alarm(0);
- 69 close(f);
- 70 close(sockfd);
- 71 }
- 72 }
复制代码 |
|