進程創建實例程序

深刻理解:fork()和wait() 的調用關係,下面是在linux環境下的一小段C程序,理解父進程和子進程的關係。
當一個進程調用了fork 以後,系統會創建一個子進程;wait 系統調用會使父進程阻塞直到一個子進程結束或者是父進程接受到了一個信號。如果父進程沒有子進程或者他的子進程已經結束了wait 會立即返回值:成功時(因一個子進程結束)wait 將返回子進程的ID;否則返回-1,並設置全局變量errno.stat_loc 是子進程的退出狀態。子進程調用exit,_exit 或者是return 來設置這個值。
 
下面是一個實例:
-----------------------------------------------------------------------------------------------------------------------
 
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <errno.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
float mn=0.0;
pid_t child;
int status;
printf("This will demostrate how to get child status\n");
if((child=fork())==-1)
exit(1);
{
int i;
printf("I am the child:%ld\n",getpid());
while(((child=wait(&status))==-1)&&(errno==EINTR))
printf("Child %ld terminated due to signal %d znot caught\n",child,WTERMSIG(stat
for(i=0;i<1000000;i++)
{
mn=sin(i);
if(i==314159)
printf("sin(100000) is :%ld\n",mn);
}
i=5;
printf("I exit with %d\n",i);
exit(i);
}
while(((child=wait(&status))==-1)&&(errno==EINTR));
if(child==-1)
printf("Wait Error:%s\n",strerror(errno)
);
else if(!status)
printf("Child %ld terminated normally return status is zero\n",child);
else if(WIFEXITED(status))
printf("Child %ld terminated normally return status is %d\n",child,WEXITSTATUS(s
tatus));
else if(WIFSIGNALED(status))
printf("Child %ld terminated due to signal %d znot caught\n",child,WTERMSIG(stat
us));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章