Linuxc高級編程之進程3

1.創建子進程
2.在子進程中打開文件file1,寫入自己的“班級_姓名_學號”,
3.
父進程讀取file1中的內容,並且打印顯示。
4.
在父進程中獲取已經結束的子進程的狀態信息,打印該信息,並且打印結束的子進程的進程號。

源代碼:
3.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include<sys/wait.h>
int main(int argc,char* argv[])
{
 int status;
 pid_t a=vfork();
 if(a<0)
 {
  printf("vfork error");
 }
 else if(a==0)
 {
  int fp=open("file1",O_RDWR|O_CREAT);
  char ch[60]="yunjisuan2_ftb_1615925560";
  write(fp,ch,60);
  close(fp);
  exit(0);
 }
 else
 {
  int i=wait(&status);
  int fq=open("file1",O_RDONLY);
  char cch[60];
  read(fq,cch,60);
  printf("%s\n",cch);
  printf("狀態信息 : %d\n",status);
  printf("正常退出時子進程號爲:%d\n pid:%d\n",i,a);// 正常退出時i==a;非正常退出時a才爲子進程號;
 }
 return 0;
}


需要創建一個文件file1,用來存放信息


所用函數:
1.vfork函數
vfork與fork的函數原型相同,但兩者的語義不同
vfork用於創建新進程,而該新進程的目的是exec一個新程序(執行一個可執行的文件)
vfork函數並不將父進程的地址空間完全複製到子進程中。
子進程在調用exec或exit之前,在父進程的地址空間中運行
vfork函數保證子進程先執行,在它調用exec或者exit之後,父進程纔可能被調度執行

2.wait

函數原型:
 pid_t  wait(int *status)
參數:
status 可以爲NULL,表明父進程不需要子進程的終止狀態。
若status不是空指針,則進程終止狀態就存放在它指向的存儲單元中,由於這些信息被存放在一個整數的不同二進制位中,所以用常規的方法讀取會非常麻煩,就設計了一套專門的宏(macro)來完成這項工作。
返回值:若成功返回終止進程ID,出錯返回-1


父進程調用wait可能出現的三種情況:
父進程的所有子進程都在運行,wait()阻塞。
父進程沒有任何子進程,則立即出錯返回。
有一個子進程已經終止,則取得該子進程的終止狀態立即返回。

檢測退出狀態的宏:
WIFEXITED(status)判斷子進程是否爲正常退出的,如果是,返回一個非零值。
WEXITSTATUS(status)當WIFEXITED返回非零值時,可以用這個宏來提取子進程的返回值,如果子進程調用exit(5)退出,WEXITSTATUS(status)就會返回5。如果進程不是正常退出的,即WIFEXITED返回0,這個值就毫無意義。
注意:這裏的參數status是wait函數中指針所指向的整數,切記不要搞混了。






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