3.
父進程讀取file1中的內容,並且打印顯示。
4.
在父進程中獲取已經結束的子進程的狀態信息,打印該信息,並且打印結束的子進程的進程號。
源代碼:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include<sys/wait.h>
{
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)來完成這項工作。
父進程的所有子進程都在運行,wait()阻塞。
父進程沒有任何子進程,則立即出錯返回。
有一個子進程已經終止,則取得該子進程的終止狀態立即返回。
檢測退出狀態的宏:
WIFEXITED(status)判斷子進程是否爲正常退出的,如果是,返回一個非零值。
WEXITSTATUS(status)當WIFEXITED返回非零值時,可以用這個宏來提取子進程的返回值,如果子進程調用exit(5)退出,WEXITSTATUS(status)就會返回5。如果進程不是正常退出的,即WIFEXITED返回0,這個值就毫無意義。
注意:這裏的參數status是wait函數中指針所指向的整數,切記不要搞混了。