進程 fork exec,wait/waitpid

1,函數原型爲:pid_t fork();調用一次返回兩次,返回調用進程的pid號。

     pid_t pid;

     pid=fork();

     如果pid>0,則是子進程的進程號,說明此時調用進程是父進程;如果返回是0,則說明此時調用進程是子進程,若<0,則說明fork()出錯。

    

      因爲讀時共享和寫時複製,子進程會複製父進程的代碼,但是從fork下開始執行。但是,當在fork前定義父子進程都用到的變量的時候,這時候父子進程並不是同時操作這個變量,而是相互獨立的,也就是說:子進程指定自己的n,不會在父進程的n的基礎上操作。

    

       pid_t getpid(void);返回調用進程的pid號

        pid_t getppid(void);返回調用進程的父進程的pid號

     依賴的頭文件#include <unistd.h>        #include<sys/types.h>

         uid_t getuid(void);   返回實際用戶ID

         uid_t geteuid(void);  返回有效用戶ID

        gid_t getpid(void);返回實際用戶組ID

        gid_t getepid(void);返回有效用戶組ID


2,exec

      加載新的程序來替換當前進程的代碼段和數據段。

     

      int execl(constchar *path, const char *arg, ...);

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

      int execle(constchar *path, const char *arg,  ..., char * const envp[]);

      int execv(constchar *path, char *const argv[]);

      int execvp(constchar *file, char *const argv[]);

      int execvpe(constchar *file, char *const argv[], char *const envp[]);

      

     l 命令行參數列表

     p 搜素file時使用path變量

     v 使用命令行參數數組

     e 使用環境變量數組,不使用進程原有的環境變量,設置新加載程序運行的環境變量

 3,wait/waitpid

      

       殭屍進程: 子進程退出,父進程沒有回收子進程資源(PCB),則子進程變成殭屍進程

       孤兒進程: 父進程先於子進程結束,則子進程成爲孤兒進程,子進程的父進程成爲1號,進程init進程,稱爲init進程領養孤兒進程

       依賴的頭文件 #include <sys/types.h>   #include <sys/wait.h>

        pid_t wait(int *status);

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

        如果不需要知道具體出錯原因,就傳wait(NULL),


        pid:

           <-1      回收指定進程組內的任意進程

           -1         回收任意子進程

            0         回收和當前調用waitpid一個組的所有子進程

           >0        回收指定ID的子進程

         options:

            WNOHANG  非阻塞

        具體如果不會用,不知道如何傳參就用man函數來看一下。

         

     


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章