知识大全 linux下的应用开发起步--简化蚂蚁制作(三)
Posted 文件
篇首语:知识可羡,胜于财富。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 linux下的应用开发起步--简化蚂蚁制作(三)相关的知识,希望对你有一定的参考价值。
C 前面看了一大段是不是有点云里雾里的啊?是有点罗嗦 但是俗话说 万事总是开头难 OK 现在总算可以写主程序文件了 下面就是ant c文件 #include ant h #include signal h // 表示不用 表示用代理 int use_proxy; //代理服务器的地址 char proxy_server[ ]; //端口 u_short proxy_port; //蚂蚁数目 int ant_num; //下载量 int bulk; //下载进程 int progress; char cfgfile[ ]; char logfile[ ]; struct Ant* ants[ ]; struct Mission ms; //响应异常退出 将url ant数据结构中的变量值 存放到log文件 void justpause() int i; FILE* log; log=fopen(logfile w ); fprintf(log %s ms url); for(i= ;iamount!= ) fprintf(log %d:%d ants[i] >position ants[i] >amount); fclose(log); exit( ); //总算挨到主程序了 呵呵 int main(int argc char** argv) int n; int maxfd; char savefile[ ]; FILE* goods; FILE* log; fd_set rset aset; int finished; int length; char status[ ]; char c; struct sigaction sa; //初始化环境参数 init_env( ); //对命令行传进来的参数做判断 while((c=getopt(argc argv n:u:s:p:l:h ))!=EOF) switch (c) //取得蚂蚁数目 case n : ant_num=atoi(optarg); if(ant_num > MAXANTNUM) ant_num = MAXANTNUM; break; //取得目标的url地址 case u : strcpy(ms url optarg); break; //取得代理的地址 case s : strcpy(proxy_server optarg); use_proxy= ; break; //取得代理的端口 case p : use_proxy= ; proxy_port=(u_short)atoi(optarg); break; //取得日志文件名 case l : strcpy(logfile optarg); break; case h : printf( usage: ant n antnum u url s proxyserver p prxoy_port l logfile ); return ; //从日志文件中读取url if(logfile[ ] != ) log = fopen(logfile r+ ); strcpy(ms url get_url_from_log(log)); //将值赋代理服务器的相关变量 if(use_proxy) strcpy(ms host proxy_server); ms port=proxy_port; else strcpy(ms host extract_from_url(ms url SITENAME)); ms port = atoi(extract_from_url(ms url PORTNAME)); //如果有下载日志 从日志中取相关信息 if(logfile[ ] != ) printf( The file you havent download continue ); n= ; strcpy(ms url get_url_from_log(log)); while ( ) ants[n] = (struct Ant*)malloc(sizeof(struct Ant)); memset(ants[n] sizeof(struct Ant)); if(!(assign_mission(log ants[n]))) break; n++; if(n > MAXANTNUM) printf( You logfile must be wrong! ); exit( ); fclose(log); free(ants[n]); ant_num=n; else //取得下载文件的大小 为每只蚂蚁分配下载位置 bulk=get_size_of_url(&ms); if(bulk== ) printf( Cannot get the size of this object! ); ant_num= ; ants[ ] = (struct Ant*)malloc(sizeof(struct Ant)); ants[ ] >position= ; ants[ ] >amount= ; else if(bulk== ) printf( Cannot connect to the site! ); exit( ); else for(n= ; nposition = (bulk/ant_num)*n; if(n!=(ant_num )) ants[n] >amount = bulk/ant_num; else ants[n] >amount = bulk (bulk/ant_num)*(ant_num ); // maxfd= ; //重设&rset FD_ZERO(&rset); //下载 按蚂蚁数开线程 for(n= ; nants[n] >s?maxfd:ants[n] >s; if(!maxfd) printf( no ant go work! ); return ; memset(&sa sizeof(struct sigaction)); //打开存储文件 strcpy(savefile extract_from_url(ms url FILENAME)); if(!(goods=fopen(savefile r+ ))) if(!(goods=fopen(savefile w ))) printf( Can not open file to save ); exit( ); strcpy(logfile savefile); strcat(logfile log ); //处理进程改变 sa sa_handler=justpause; sa sa_flags=SA_ONESHOT; sigaction(SIGINT &sa NULL); maxfd++; finished = ; progress = ; printf( ); printf( Downloading now! ); while( ) if(finished==ant_num) break; aset=rset; select(maxfd &aset NULL NULL NULL); for(n= ;ns &aset)) if(!(length=receive(ants[n] goods))) unenroll(ants[n] &rset); finished++; unlink(logfile); log=(FILE*)NULL; //打开日志文件 if(ant_num!= ) for(n= ;namount) if(!log) log=fopen(logfile w+ ); fputs(ms url log); fputc( log); //保存状态 save_status(ants[n] log); printf( Ant %d have not done!%d n+ ants[n] >amount); else printf( Ant %d done! n+ ); free(ants[n]); else free(ants[ ]); fclose(goods); if(log) fclose(log); return ; D 写完程序下面就是做makefile 程序比较小 所以MAKEFILE也比较简单 CC = gcc CFLAGS = source=ant h ant c funcs c object=ant o funcs o ant:$(object) $(CC) $(object) o $@ %o:%c $(CC) c $< o $@ $(CFLAGS) bak: tar czvf ant tgz Makefile $(source) rm f $(object) OK 到这总算飞到目的地了 现在你只要在命令行下用 make 命令就可以编译了 教训 有一个错误 调了很久才发现 就是当fprintf(log %s ms url)这样的语句的指针变量为空时 程序执行过程中就会发生 Segmentation fault (core dumped) 这样的错误 另外 由于程序没有多加判断 在输入url时 千万要带上// 或 ftp:// 哪位网友有兴趣可以自己修改 cha138/Article/program/Oracle/201311/16787相关参考
Linux下的LDAP 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 作者简介 AtifGha
Linux下的多线程编程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 线程(thr
Oracle在Linux下的安装小结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Oracle公司
在Linux下的Oracle用脚本建库实录 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先写
十分钟快速架设Linux下的WebMail 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 目前网
知识大全 Oracle 9i 在Linux 下的安装 (下)
Oracle9i在Linux下的安装(下) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
我们将从构建简单的驼鹿监视软件开始示例各种场景下的测试驱动开发 鹿是鹿家族中的最大个的成员目前世界上估计有百万头为了更好的统计世界驼鹿组织让我们开发一个驼鹿监视软件希望保护人员能够跟踪和记录他们
知识大全 Linux和Windows下的Tomcat JVM内存设置
Linux和Windows下的TomcatJVM内存设置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下
Linux下的编程PHP高级技巧全放送(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 全球
Linux下的编程PHP高级技巧全放送(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 四P