2012年(9)
分类: 嵌入式
2012-09-21 19:15:44
进程的一生
下面就让我用一些形象的比喻,来对进程短暂的一生作一个小小的总结:
随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。
然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。
人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个"}",从容地离我们而去;也可以是自杀,自杀有2种方式,一种是调用exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过另外一些方式结束他的生命。
进程死掉以后,会留下一具僵尸,wait和waitpid充当了殓尸工,把僵尸推去火化,使其最终归于无形。
这就是进程完整的一生
。
1进程是PID,与PPID的判断方式
(1)switch(pid) {
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n", pid, getppid());
break;
case -1:
perror("Process creation failed\n");
break;
default:
printf("Parent process is running,ChildPid is %d,ParentPid is %d\n", pid, getpid());
break;
}
(2)if((pid=fork())==-1){
Perror(“fork”);
Exit(-1);
}
Else if(pid == 0){
/*pid=0代表子进程*/
Printf(”是不是pid了返回呢”);
}
Else{
/*可以想到大于0的是父进程了直接printf就可以了*/
}
一个代码来说明一下创建为fork.c;
#include
#include
#include
#include
int main(void)
{
pid_t pid;
printf("Process Creation Study");
pid = fork();
switch(pid) {
case 0:
printf("Child process is running,CurPid is %d,ParentPid is %d\n", pid, getppid());
break;
case -1:
perror("Process creation failed\n");
break;
default:
printf("Parent process is running,ChildPid is %d,ParentPid is %d\n", pid, getpid());
break;
}
printf("success!\n");
exit(0);
}
root@ubuntu:/mnt/1208# gcc -o build fork.c
root@ubuntu:/mnt/1208# ./build
Process Creation StudyParent process is running,ChildPid is 3402,ParentPid is 3401
success!
root@ubuntu:/mnt/1208# Process Creation StudyChild process is running,CurPid is 0,ParentPid is 1
success!
也可以用ps-ef看PID ,PPID. root@ubuntu:/mnt/1208#出现的原因是因为父进程先结束,如果出来是子进程就没有了,vfork的执行顺序是先子进程后父进程。
Exec函数就是提供了一个在进程中启动另一个程序的方法。如fork 的子进程调用exec就是一个独立的新进程