Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1522374
  • 博文数量: 114
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1357
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 18:13
文章分类
文章存档

2010年(8)

2009年(9)

2008年(27)

2007年(62)

2006年(8)

我的朋友

分类: LINUX

2007-09-05 23:42:03

北京理工大学 20981 陈罡
胡乱扫了一眼a1200的/bin目录,发现了里面有不少很有用的可执行程序。例如:tar,gzip,
unzip等等,这里我就对unzip在程序中的使用做一个简单的说明:
unzip程序可以用于解压缩zip格式的压缩文件包,加上适当的参数可以将文件包的内容解压到
指定的目录。这里只写几个对我们很有用的参数:
-q  也即quiet模式,让unzip不输出什么信息,这种模式可以广泛应用于脚本,或者将unzip
    程序集成到别的程序中。
-o  也即over write,如果要解压的目录或者文件在手机上已经存在,使用该选项可以忽略
    那些已经存在的文件,利用解压出来的文件内容直接覆盖已经存在的文件内容。
-d  就是directory了,意思是把解压出来的文件解压到什么地方,这里可以是绝对路径也可以
    是相对路径。
举个例子,现在在手机的存储卡目录有一个叫a.zip的压缩包,我希望把它解压到
/mmc/mmca1/test目录下面,那么用命令行的方式应该采用如下命令:
# unzip -q -o ./a.zip -d /mmc/mmca1/test
呵呵,这些只是最基本的命令使用了,可能有的朋友会说,没人能那么方便的使用命令行环境
的,我们可以把这个操作集中到程序中去,这样既可以发挥手机内置unzip的强大功能,又可以
节约不少用于解压缩的代码,何乐而不为呢:
char * m_unzip_cmd[] = {
  "unzip", "-q", "-o", "a.zip", "-d", "/mmc/mmca1/test", NULL
} ;
注意:这里必须要用NULL结束,不可缺少,这是由execvp函数决定的。
// fork a new process to unzip the file
if((m_unzip_pid = fork()) == 0) {
 execvp(m_unzip_cmd[0],(char* const*)m_unzip_cmd) ; 
     exit(0) ;
} else {
 //parent process
 while(1) {
  wait_val = waitpid(-1, &m_status, WNOHANG) ;
  if(wait_val == 0) sleep(1) ;
  else break ;
 } 
}
呵呵,这个while循环需要说明一下了,这里的pid不等于零的代码段,意思是进入了主进程,
waitpid用于在主进程中获得刚刚fork出来的子进程的状态,在此,子进程为一个的墓地就是
调用execvp函数,执行unzip的命令,如果子进程没有执行完毕,则waitpid(...)会返回0,
如果子进程执行完毕,waitpid会返回子进程的pid,如果子进程已经退出,那么waitpid会
持续返回-1。如果我们把wait_val的值输出的话,会看到如下的结果:
0  // 代表子进程没有结束(unzip运行中)
0
0
0
263 // 这里子进程刚刚结束
-1  // 这里代表已经没有子进程了,所以持续返回-1
-1
-1
可以利用这个while循环,制作一个阻塞型的unzip函数,解压指定文件到制定位置。
是不是很方便,如果看着上面的代码有困难的朋友,可以到网上查一下fork以及wait和waitpid
的函数定义和基本用法,就对上述使用一目了然了。
 
原本想更进一步,在解压zip的时候搞一个进度条什么的,后来经过真机测试,一个6.81M的含有多级
目录嵌套的zip文件,解压开始到结束,如果使用moto a1200 自带的unzip,仅需要6-8s,速度非常快。
如果用自己编译的unzip跑的话,速度要慢5-10s左右。由此看来,基本上可以不用进度条了,小的文件,
几乎一闪就解压完毕了。呵呵,在此不得不赞一下moto的硬件选型还是比较高的。
 
用上述方法就可以方便的调用a1200系统unzip程序,来为我们自己的程序服务了,是不是很酷?
阅读(3690) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~