文件描述符fd、文件指針fp和vfork()
阿新 • • 發佈:2017-05-24
運行 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 return0; 27 }
子進程改變了父進程的值(改變了父進程看到的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()