Linux環境編程之進程(五):競爭條件以及exec函數

來源:互聯網
上載者:User

標籤:exec函數   競爭條件   

(一)

當多個進程企圖對共用資料進行某種處理,而最後的結果又取決於進程啟動並執行順序時,就認為它們發生了競爭關係。避免競爭的條件,給出apue上的一個代碼吧:

#include "apue.h"static void charatatime(char *);intmain(void){pid_t pid;TELL_WAIT(); /*set things up for TELL_XXX & WAIT_XXX*/if((pid == fork()) < 0){err_sys("fork error");}else if(pid == 0){WAIT_PARENT(); /*tell parent wr‘re done*/charatatime("output from child.\n");}else{charatatime("output from parent.\n");TELL_CHILD(pid); /*tell child we‘re done*/}exit(0);}static void charatatime(char *str){char *ptr;int c;setbuf(stdout, NULL);for(ptr = str; (c = *ptr++) != 0;)putc(c, stdout);}

(二)

對基本的進程式控制制原語,前面提到用fork可以建立新進程,exit函數和兩個wait函數處理終止和等待終止,用exec函數可以執行新的程式。

       #include <unistd.h>
       extern char **environ;
       int execl(const char *path, const char *arg, ...);
       int execv(const char *path, char *const argv[]);

       int execle(const char *path, const char *arg, ..., char * const envp[]);
      int execve(const char *path, const char *arg, ..., char * const envp[]);
       int execvp(const char *file, char *const argv[]);

int execlp(const char *file, const char *arg, ...);

這些函數的區別有:

1、前4個去路徑名作為參數,後兩個取檔案名稱作為參數。

2、與參數表的傳遞有關(l表示list,v表示vector)。

3、與向新程式傳遞環境表相關。以e結尾的兩個函數可以傳遞一個指向環境字串指標數組的指標。其他4個函數則使用調用進程中的environ變數為新程式複製現有環境。

這6個函數中只有execve是核心的系統調用。另外5個只是庫函數,它們最終都要調用該系統調用。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.