博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Linux库函数int system(const char *command);
阅读量:6232 次
发布时间:2019-06-21

本文共 1025 字,大约阅读时间需要 3 分钟。

hot3.png

经常使用system();,可最近因为要做一个顺序调用执行的程序,就是相当于要执行两次system();

system("tar -zcvf xxx.tar.gz xxx"); //第一步先执行打包system("tar -zxvf xxx.tar.gz");     //第二步等第一步执行完了打包,再执行解包

类似于上面那种形式,第二步必须在第一步执行完毕后,再开始执行,否则第二步执行不了,或者最终得到的结果也是不正确的。现在就有疑问了?system();库函数调用,到底是不是阻塞式的?

通过man system可以看到,system是库函数,不是系统调用。并且可以知道system();是阻塞调用,就是说上面的代码中,只有当第一步system调用的tar命令完成打包工作之后返回,才回执行第二个system的解包工作,那么意味着,这样就可以解决我们最开始提到的问题了,制造一个同步顺序执行的程序。

问题又来了,倘若我们要做一个异步的呢?怎么办?

也就是说假设有如下需求:

system("tar -zcvf xxx.tar.gz xxx");   //第一步给xxx打包,并不影响第二步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();呢?

pid_t wait   (           int *status             );pid_t waitpid(pid_t pid, int *status, int options);

waitpid可以说是wait的封装吧,多两个参数kegon,pid和options。

此处使用waitpid比较好,在接下来的一个循环中不断地去waitpid两个子进程,并且用WNOHANG的option,当然可以加一个sleep(1)来减小cpu的占用率。

 

 

 

转载于:https://my.oschina.net/michaelyuanyuan/blog/79506

你可能感兴趣的文章
神经网络和深度学习-第二周神经网络基础-第二节:Logistic回归
查看>>
ElasticSearch 2 (32) - 信息聚合系列之范围限定
查看>>
VS2010远程调试C#程序
查看>>
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
Apache Pulsar中的地域复制,第1篇:概念和功能
查看>>
python pip install 出现 OSError: [Errno 1] Operation not permitted
查看>>
oracle12C 重做日志
查看>>
zookeeper与kafka安装部署及java环境搭建(发布订阅模式)
查看>>
从源码分析scrollTo、scrollBy、Scroller方法的区别和作用
查看>>