pid_tfork(void);//創(chuàng)建子進(jìn)程成功時(shí),向子進(jìn)程返回0,并將子進(jìn)程的進(jìn)程ID返回給父進(jìn)程//創(chuàng)建失敗時(shí),返回-1,并將errno設(shè)置為EAGAIN返回值是允許父進(jìn)程和子進(jìn)程區(qū)別自己并執(zhí)行不同代碼的關(guān)鍵特征。#include

日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Linux學(xué)習(xí)筆記12——Unix中的進(jìn)程

系統(tǒng) 2428 0

  通過(guò)調(diào)用fork和exec函數(shù)都能創(chuàng)建新的進(jìn)程,但兩者有著本質(zhì)的區(qū)別:fork函數(shù)拷貝了父進(jìn)程的內(nèi)存映像,而exec函數(shù)用用新的映像來(lái)覆蓋調(diào)用進(jìn)程的進(jìn)程映像的功能。

一? fork函數(shù)

#include <unistd.h>

    pid_t fork(void);     //創(chuàng)建子進(jìn)程成功時(shí),向子進(jìn)程返回0,并將子進(jìn)程的進(jìn)程ID返回給父進(jìn)程

               //創(chuàng)建失敗時(shí),返回-1,并將errno設(shè)置為EAGAIN

    返回值是允許父進(jìn)程和子進(jìn)程區(qū)別自己并執(zhí)行不同代碼的關(guān)鍵特征。

      #include <stdio.h>
      
        

#include 
      
      <unistd.h>
      
        

#include 
      
      <sys/types.h>




      
        int
      
       main(
      
        void
      
      
        ){

  pid_t childpid;                     
        
          //子進(jìn)程的ID
        
        

  childpid
      
      =
      
        fork();                   
        
           //創(chuàng)建子進(jìn)程 
        
      
      
        if
      
      (childpid==-
      
        1
      
      
        ){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 
        
          //創(chuàng)建子進(jìn)程失敗
        
        

    perror(
      
      
        "
      
      
        Failed to fork
      
      
        "
      
      
        );

    
      
      
        return
      
      
        1
      
      
        ;

  }

  
      
      
        if
      
      (childpid==
      
        0
      
      
        ){ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
        
          //創(chuàng)建子進(jìn)程成功
        
        

    printf(
      
      
        "
      
      
        I am child %ld\n
      
      
        "
      
      ,(
      
        long
      
      
        )getpid()); ? ? ?
        
          //打印子進(jìn)程的ID
        
        

  }

  
      
      
        else
      
      
        {

    printf(
      
      
        "
      
      
        I am parent %ld\n
      
      
        "
      
      ,(
      
        long
      
      
        )getpid()); ? ? 
        
          //打印父進(jìn)程的ID
        
        

  }   

}
      
    

?

二 exec函數(shù)

  有六種不同形式的exec函數(shù),如下:

      #include <unistd.h>




      
        int
      
       execl(
      
        const
      
      
        char
      
       *path,                  ? ? 
      
        //進(jìn)程映像文件的路徑名,可以是全限定路徑名,也可以是相對(duì)于當(dāng)前目錄的路徑名
      
      
      const char *arg,... );                int execle( const char *path, const char *arg,..., char *const envp[] ); ? ? //最后一個(gè)參數(shù)必須以空指針(NULL)作結(jié)束 int execlp( const char *file, const char *arg,... ); int execv( const char *path,
char * const argv[]);         //參數(shù)數(shù)組,用來(lái)存放指向你的字符串參數(shù)的指針數(shù)組 int execve( const char *path, char * const argv[], char * const envp[]); int execvp( const char *file, char * const argv[]);

  execv開(kāi)頭的函數(shù)是把參數(shù)以"char *argv[]"這樣的形式傳遞命令行參數(shù)。而execl開(kāi)頭的函數(shù)采用了我們更容易習(xí)慣的方式,把參數(shù)一個(gè)一個(gè)列出來(lái),然后以一個(gè)NULL

表示結(jié)束,也可以寫成(char *)0。

  如果創(chuàng)建子進(jìn)程不成功,所有的exec函數(shù)都返回-1,并設(shè)置errno,以下是errno的類型和原因。

  E2BIG:新進(jìn)程的參數(shù)表和環(huán)境表長(zhǎng)度以系統(tǒng)所允許的ARG_MAX字節(jié)的限制要長(zhǎng)

  EACCES:對(duì)新進(jìn)程路徑前綴中目錄的搜尋權(quán)限被否定,新進(jìn)程映像文件的執(zhí)行權(quán)限被否定,或者新進(jìn)程映像文件不是正常的文件,且不能被執(zhí)行

  EINVAL:新進(jìn)程映像文件有恰當(dāng)?shù)臋?quán)限,且以可識(shí)別可執(zhí)行的二進(jìn)制格式出現(xiàn)

  ELOOP:在對(duì)參數(shù)path或file進(jìn)行解析時(shí)存在循環(huán)

  ENAMETOOLONG:path或file的長(zhǎng)度超出了PATH_MAX的范圍,或者路徑名組件比NAME_MAX要長(zhǎng)

  ENOENT:path或file組件命名的不是一個(gè)現(xiàn)存的文件,或者path或file為空字符串

  ENOEXEC:映像文件有恰當(dāng)?shù)脑L問(wèn)權(quán)限,但它的格式不可識(shí)別(不適用于execlp或execvp)

  ENOTDIR:映像文件路徑前綴的組件不是一個(gè)目錄

      
             int
      
       main(
      
        int
      
       argc,
      
        char
      
       *argv[],
      
        char
      
       *
      
        envp[])

        {

             
      
      
        char
      
       *arg[]={
      
        "
      
      
        ls
      
      
        "
      
      ,
      
        "
      
      
        -a
      
      
        "
      
      
        ,NULL};

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execl...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execl(
      
        "
      
      
        /bin/ls
      
      
        "
      
      ,
      
        "
      
      
        ls
      
      
        "
      
      ,
      
        "
      
      
        -a
      
      
        "
      
      ,NULL)<
      
        0
      
      
        )

                 {

                      fprintf(stderr,
      
      
        "
      
      
        execl failed:%s
      
      
        "
      
      
        ,strerror(errno));

                      
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execv...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execv(
      
        "
      
      
        /bin/ls
      
      
        "
      
      ,arg)<
      
        0
      
      
        )

                 {

                     fprintf(stderr,
      
      
        "
      
      
        execl failed:%s\n
      
      
        "
      
      
        ,strerror(errno));

                     
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execlp...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execlp(
      
        "
      
      
        ls
      
      
        "
      
      ,
      
        "
      
      
        ls
      
      
        "
      
      ,
      
        "
      
      
        -a
      
      
        "
      
      ,NULL)<
      
        0
      
      
        )

                 {

                     fprintf(stderr,
      
      
        "
      
      
        execl failed:%s
      
      
        "
      
      
        ,strerror(errno));

                     
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execvp...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execvp(
      
        "
      
      
        ls
      
      
        "
      
      ,arg)<
      
        0
      
      
        )

                 {

                     fprintf(stderr,
      
      
        "
      
      
        execl failed:%s\n
      
      
        "
      
      
        ,strerror(errno));

                     
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execle...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execle(
      
        "
      
      
        /bin/ls
      
      
        "
      
      ,
      
        "
      
      
        ls
      
      
        "
      
      ,
      
        "
      
      
        -a
      
      
        "
      
      ,NULL,envp)<
      
        0
      
      
        )

                 {

                     fprintf(stderr,
      
      
        "
      
      
        execl failed:%s
      
      
        "
      
      
        ,strerror(errno));

                     
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }

             
      
      
        if
      
      (fork()==
      
        0
      
      
        )

             {

                 printf(
      
      
        "
      
      
        execve...........\n
      
      
        "
      
      
        );

                 
      
      
        if
      
      (execve(
      
        "
      
      
        /bin/ls
      
      
        "
      
      ,arg,envp)<
      
        0
      
      
        )

                 {

                     fprintf(stderr,
      
      
        "
      
      
        execl failed:%s\n
      
      
        "
      
      
        ,strerror(errno));

                     
      
      
        return
      
       -
      
        1
      
      
        ;

                 }

             }



          
      
      
        return
      
      
        0
      
      
        ;

        }
      
    

?

?

Linux學(xué)習(xí)筆記12——Unix中的進(jìn)程


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!?。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 霍林郭勒市| 大埔县| 南汇区| 讷河市| 宁城县| 湘潭县| 当阳市| 大竹县| 电白县| 延寿县| 堆龙德庆县| 余江县| 新昌县| 霸州市| 台湾省| 虞城县| 家居| 荆门市| 雷州市| 桃园县| 喀喇沁旗| 隆德县| 汪清县| 枣庄市| 石狮市| 乐昌市| 濮阳市| 剑川县| 永胜县| 丰台区| 建德市| 东辽县| 句容市| 新河县| 通州区| 商河县| 睢宁县| 札达县| 石泉县| 乌拉特中旗| 大宁县|