关于进程与进程调度
作者:拉格浪日 标签:技术 | 阅读次数: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后,再普通的 子进程也可以在浴火中复活,执行新的代码,但是进程标志号没有变化。 凤凰涅磐后,取代它的,必然是一个新生! |