- 金錢
- 1528
- 威望
- 5296
- 貢獻值
- 378
- 推廣值
- 2
- 性別
- 男
- 在線時間
- 401 小時
- 最後登錄
- 2024-11-14
- 主題
- 989
- 精華
- 0
- 閱讀權限
- 90
- 註冊時間
- 2011-12-29
- 帖子
- 0
TA的每日心情 | 怒 2024-11-3 15:50 |
---|
簽到天數: 1258 天 [LV.10]以壇為家III - 推廣值
- 2
- 貢獻值
- 378
- 金錢
- 1528
- 威望
- 5296
- 主題
- 989
|
樓主
發表於 2012-9-21 23:43:00
Linux库函数int system(const char*command)简析
经常使用system();,可最近因为要做一个顺序调用执行的程序,就是相当于要执行两次system();
1 system("tar -zcvf xxx.tar.gz xxx"); //第一步先执行打包
2 system("tar -zxvf xxx.tar.gz"); //第二步等第一步执行完了打包,再执行解包
类似于上面那种形式,第二步必须在第一步执行完毕后,再开始执行,否则第二步执行不了,或者最终
得到的结果也是不正确的。现在就有疑问了?system();库函数调用,到底是不是阻塞式的?
通过man system可以看到,system是库函数,不是系统调用。并且可以知道system();是阻塞调用,
就是说上面的代码中,只有当第一步system调用的tar命令完成打包工作之后返回,才回执行第二个
system的解包工作,那么意味着,这样就可以解决我们最开始提到的问题了,制造一个同步顺序执行的程序。
问题又来了,倘若我们要做一个异步的呢?怎么办?
也就是说假设有如下需求:
1 system("tar -zcvf xxx.tar.gz xxx"); //第一步给xxx打包,并不影响第二步
2 system("tar -zcvf yyy.tar.gz yyy"); //第二步给yyy打包,并不依赖第一步
我参考了rpm的程序的源代码,利用fork();系统调用,让子进程去执行"tar -zcvf xxx.tar.gz xxx",
然后父进程再fork一个子进程去执行"tar -zcvf yyy.tar.gz yyy"。这样就解决了异步问题。
问题又来了,那接下来父进程该干什么?
既然fork了,肯定要进行wait,那是用wait();还是waitpid();呢?
1 pid_t wait ( int *status );
2 pid_t waitpid(pid_t pid, int *status, int options);
waitpid可以说是wait的封装吧,多两个参数kegon,pid和options。
此处使用waitpid比较好,在接下来的一个循环中不断地去waitpid两个子进程,并且用WNOHANG的
option,当然可以加一个sleep(1)来减小cpu的占用率。 |
|