知识大全 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

Linux下的LDAP  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者简介  AtifGha

知识大全 Linux下的多线程编程

Linux下的多线程编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言    线程(thr

知识大全 Oracle在Linux下的安装小结

Oracle在Linux下的安装小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Oracle公司

知识大全 在Linux下的Oracle 用脚本建库实录

在Linux下的Oracle用脚本建库实录  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先写

知识大全 十分钟快速架设Linux下的WebMail

十分钟快速架设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高级技巧全放送(一)

Linux下的编程PHP高级技巧全放送(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  全球

知识大全 Linux下的编程 PHP高级技巧全放送(二)

Linux下的编程PHP高级技巧全放送(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  四P