首页 | 手机版 | 三国演义 | 三国志 | 史将 | 背景 | 藏书阁
首页 -> 精彩文章 -> 关于进程与进程调度

关于进程与进程调度

作者拉格浪日 标签技术 阅读次数:109
1.《僵尸进程》
#include
#include
it main(void)
{
pid_t pid;
pid=fork();
if(pid==0)
{
  printf(" children;\n");
  exit(0);
}
else if(pid>0)
{
  printf("parent ,child id is %d",pid);
  sleep(10);
  wait(NULL);
}
else
{
  printf("error");
}
exit(0);
}
后台执行后会怎么样呢?
ps -l一下会看到
s里有一个z状态的,其wchan为 wait4状态
子进程在退出后,还在进程列表里有一个记录,此时它就是僵尸进程(zombie)!
记得cranberries 的那首悲壮的zombie吗?zombie有时也不像它表面上那样。
一句“What's in your head, in your head”拷问了多少人的灵魂。
这里直到父进程的wait执行后才能清除它的纪录,wait带参数可以返回子进程的返回值。
2.《撒加之地》
#include
#include
int main(void)
{
 char *c[]={"123"};
 printf("%s",c[0]);
 printf("\n address is %0x",&(*c[0]));
 c[0]="adsfasdf";
 printf("\n%s",c[0]);
 c[0][0]='p';
 assert(c[0]);
 printf("\n after change p %s",p);
}
c[0]可以再赋值,运行时分配了特定的内存,并且可以在重新赋值,估计是编译时就给分配了特定的空

间。但是c[0][0]='p';告诉我那只是readonly的。
就像地狱中最底层的撒加守护的那个地方一样,平常的幽灵不能在那里"有为".
2.《凤凰涅磐》
#include
#include
int main (void)
{
 int pid;
 char *cmd[] = { "ls", "-l", (char *) 0 };
 char *env[] = { "user=root" };
 pid = fork ();
 switch (pid)
  {
  case -1:
   perror ("fork failed");
   exit (1);
  case 0:
   execve ("/bin/ls", cmd, env);
   exit (0);
  default:
   wait (NULL);
  }
 exit (0);
}
原来fork一个子进程后,它并不做什么,只是在需要时把自己父进程的内容复制过来,也就是copy on

write ,有点大公无私啊,让我干嘛就干嘛,死就死掉吧!可是正如凤凰一样,经过execve后,再普通的

子进程也可以在浴火中复活,执行新的代码,但是进程标志号没有变化。
凤凰涅磐后,取代它的,必然是一个新生!


浙ICP备06020153号-1