主要是对进程操作的一些介绍。
这个键盘真的太难用了。。。
进程的概念
进程是操作系统资源分配的基本单位。
就比如你的扣扣,你不双击图标的时候它是一个死的东西,就只是能用的花枝招展的代码阿乱七八糟的, 是程序。但是你双击了那个企鹅,死的程序就运行了,你就可以聊天了,这个时候就创建了一个动态的东西,进程。这个进程里的内容就是你正玩的扣扣。一个进程由三部分组成:
进程的状态
说实话只是看书的话这里是没有看懂,真是一本好书,书如其名,编程实战。都是名词解释简直一点道理都不讲!
进程有三种基本状态:就绪、等待、执行。你所看到的乱七八糟的其他名词都是分支。
举个栗子,CPU是个洗手间,有很多人想要上洗手间,每个人都是独立的个体就像进程一样,但是,CPU只有一个坑位,所以CPU就说一个人只能上三分钟,三分钟能干什么?哈哈哈。因为大家都很个性,这就有了很多状况。
然后
书上的一些状态其实我也不太懂,将就着理解吧。。
运行状态[R]unnable:执行或者就绪
可中断等待状态[S]leeping:正在阻塞着但是要手机的态度不坚决别人一个寒冷的眼 神就乖乖上厕所去了
不可中断等待状态[D]uninterruptible sleep: 没手机就不上就不会上就不上
僵死状态[Z]ombile: 上完厕所不各找各妈就是舍不得走,占一条通往坑位的路让别人走其他的路吧
停止状态[T]raced or stopped: 一个形象的栗子->gdb,不是那种~嗖~的执行而是像劣质触屏那种~咔~咔~咔~,滑一下走一步。别人一个示意就算时间没到也乖乖提起裤子,好听话好乖巧和别的妖艳贱货不一样呢~内存映像
一个进程是如何诞生又如何消失?
操作系统对它做了什么?
它为何牵扯到磁盘?
可执行程序和内存映像又有什么区别?
欢迎下期收看——
走进科学之《我还不太会但是我今天要交差》进程基本操作的一些总结
但其实就是课后题的改编
——按书上来我要写到开电热毯的时候才能写完 ~=皿=~举例fork&vfork相对于子进程和父进程的异同
int globVar = 5;
int main(int argc, char *argv[]){
pid_t pid;
int var = 1, i;
printf("fork is diffrent with vforki\n");
// pid = fork(); //换着来
pid = vfork();
switch(pid){
case 0:
i = 3;
while(i-- > 0){
printf("child process is running\n");
globVar++;
var++;
sleep(5);
}
printf("child's globVar = %d, var = %d\n",globVar, var);
break;
case -1:
perror("process creation failed\n");
exit(0);
default:
i = 5;
while(i-- > 0){
printf("the parent process is running\n");
globVar++;
var++;
sleep(5);
}
printf("parent's globVar = %d,var = %d\n",globVar, var);
exit(0);
}
}
执行vfork时:
执行fork时:
fork的时候,子进程除了进程ID、文件锁、进程的警告balabala的大部分都是继承的父进程的属性,基本上完全复制父进程的资源。但是,因为它有自己的ID,所以就有子进程就有自己独立的地址空间所以不管是对全局还是局部变量的操作对于父子来说并不相互影响。分家自己过自己的日子的坏处就是要多买一套房。
vfork的时候,子进程共享父进程的资源,所以子进程对全局或局部变量的修改对父进程是可见的,他俩改的是同一个东西。父进程舍不得子进程所以不分家,一切运行以子进程优先,子进程挂了父进程才考虑自己。如果子进程的执行可能需要父进程执行产生的某种作用,也就是子进程执行中要依赖父进程的某个行为,子进程说爸你执行一下,父进程说你先你先,然后这父子俩就一直这么僵持着,死锁了。
后台进程、守护进程的区别和创建
创建流程
通过新建就可以很明显的看出区别了。
不过守护进程比较麻烦切而已。
调用setsid有3个作用:
让进程摆脱原会话的控制
让进程摆脱原进程组的控制
让进程摆脱原控制终端的控制
一般来说,umask()的参数设置为零,这样就不会屏蔽任何人的操作了。
编写一个多进程的程序
like this!
不写了,去吃饭!