zoukankan      html  css  js  c++  java
  • 关于Linux库函数int system(const char *command);

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    超简单tensorflow入门优化程序&&tensorboard可视化
    tf.random_normal()函数
    tensorflow中创建多个计算图(Graph)
    tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程
    配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
    取奇偶数
    DNS添加/修改/查询/删除A记录
    IE自动化
    Get-ChildItem参数之 -Exclude,Filter,Recurse应用
    自动下载
  • 原文地址:https://www.cnblogs.com/shihao/p/2695414.html
Copyright © 2011-2022 走看看