Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34384
  • 博文数量: 9
  • 博客积分: 172
  • 博客等级: 入伍新兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-08 21:15
文章分类

全部博文(9)

文章存档

2012年(9)

最近访客

分类: 嵌入式

2012-09-21 19:15:44

进程的一生

下面就让我用一些形象的比喻,来对进程短暂的一生作一个小小的总结:



随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。

然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。



人有生老病死,进程也一样,它可以是自然死亡,即运行到main函数的最后一个"}",从容地离我们而去;也可以是自杀,自杀有2种方式,一种是调用exit函数,一种是在main函数内使用return,无论哪一种方式,它都可以留下遗书,放在返回值里保留下来;它还甚至能可被谋杀,被其它进程通过另外一些方式结束他的生命。


进程死掉以后,会留下一具僵尸,waitwaitpid充当了殓尸工,把僵尸推去火化,使其最终归于无形。


这就是进程完整的一生

1进程是PID,与PPID的判断方式

1switch(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;

}

2if((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-efPID ,PPID. root@ubuntu:/mnt/1208#出现的原因是因为父进程先结束,如果出来是子进程就没有了,vfork的执行顺序是先子进程后父进程。

Exec函数就是提供了一个在进程中启动另一个程序的方法。如fork 的子进程调用exec就是一个独立的新进程


阅读(1648) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~