|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 663|回復: 0
打印 上一主題 下一主題

Linux库函数int system(const char*command)简析

[複製鏈接]

989

主題

1

好友

5296

積分

教授

Rank: 8Rank: 8

  • 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的占用率。
    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-11-16 05:06 , Processed in 0.071471 second(s), 27 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部