標籤: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個只是庫函數,它們最終都要調用該系統調用。