1. 程式人生 > >文件描述符fd、文件指針fp和vfork()

文件描述符fd、文件指針fp和vfork()

運行 color 調用exe urn 系統 通用 依賴 使用 src

1.

  fd:在形式上是一個非負整數.實際上他是一個索引值、指向kernal為每一個進程所維護的該進程打開文件的記錄表.

    當程序打開一個文件或者創建一個新文件的時候kernal向進程返回一個文件描述符。

  優點:兼容POSIX標準,許多系統調用都依賴於它;缺點:不能移植到unix之外的系統上去

  fp:FILE*指針變量標識符

  優點:是C語言的通用格式,便於移植

技術分享

2.

  vfork:使用方法同fork差不多,也適用於創建子進程

  vofork特點:

    1)在子進程調用exec或exit之前,它在父進程的空間裏運行,會改變父進程的數據段、棧和堆

eg:      

 int  g_val=0;
  9 int main()
 10 {
 11         pid_t id=vfork();
 12         if(id<0){
 13                 perror("vfork");
 14                 return 1;
 15         }
 16         else if(id==0){//child
 17                 g_val=100;
 18                 printf("child:pid:%d ppid:%d,g_val:%d,&g_val:%p\n
", 19 getpid(),getppid(),g_val,&g_val); 20 exit(1); 21 } 22 else{ 23 printf("father:pid:%d,ppid:%d,g_val:%d,&g_val:%p\n", 24 getpid(),getppid(),g_val,&g_val); 25 } 26 return
027 }

技術分享

子進程改變了父進程的值(改變了父進程看到的g_val)

    2)vfork保證子進程先運行 ,在調用了exec()或者exit()之後,父進程才可能被調度運行

     pid_t id=vfork();
 12         if(id<0){
 13                 perror("vfork");
 14                 return 1;
 15         }
 16         else if(id==0){//child
 17                 //g_val=100;
 18                 printf("child:pid:%d ppid:%d\n", 19                         getpid(),getppid());
 20                 sleep(3);                                //讓子進程先等待3秒再調用exit
 21                 exit(1);
 22         }
 23         else{
 24                 printf("father:pid:%d,ppid:%d\n", 25                         getpid(),getppid());
 26         }

 技術分享

結果是:子進程打印,等待3秒(調用了exit),父進程被調度

文件描述符fd、文件指針fp和vfork()