赞
踩
目录
故事
张三每天都有跑步的习惯,这一天他和往常一样跑步,跑了两三圈,突然跑在它前面的一个人倒在地上不动了,作为热心市民张三赶紧报警并且拨打120。很快120就来了,但是没过几分钟就走了,这个人已经噶了(去世了),并交给了警察。警察这个时候会怎样做呢?警察立刻封锁了现场,并且叫来法医,法医确认了这个人的死亡原因,并且收集了所有信息。然后告诉家属信息。这个时候再把这个人抬走。
请问从这个人倒下到他被抬走,他是死亡状态吗?
不是,他是死亡了,但是他不是死亡状态,这个时候他是僵死状态,直到他被抬走他才是死亡状态。
解决方法
代码如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
-
-
-
- int main()
- {
- pid_t id = fork();
- if(id < 0)
- {
- perror("fork");
- return 1;
- }
- else if (id > 0)
- {
- printf("parent[%d] is sleeping...\n",getpid());
- sleep(10);
- }
- else
- {
- // child进程
- printf("child[%d] is begin Z...\n",getpid());
- sleep(2);
-
- exit(EXIT_SUCCESS);
- }
- return 0;
- }
父进程结束或者异常终止,但是子进程继续运行。此时子进程的PPID被设置为1,即init进程。init进程接管了该子进程,并等待它结束,在父进程退出之后,子进程退出之前,该子进程属于孤儿进程
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
-
- int main()
- {
- pid_t id = fork();
- if (id < 0)
- {
- // 创建失败
- perror("fork");
- return 1;
- }
- else if (id == 0)
- {
- // child
- while (1)
- {
- printf("I am child, pid : %d\n", getpid());
- sleep(1);
- }
-
- }
- else
- {
- // father
- printf("I am father, pid : %d\n", getpid());
- sleep(10);
- exit(0);
- }
-
- return 0;
- }
使用 ps -al 命令
为啥Linux进程的优先级要有数值范围?
- 操作系统要较为均匀的调度进程,每个进程都要得到调度。
- 如果一个进程的优先级太大(太小),就会导致一直占用cpu(一直得不到调度---->进程饥饿)
用top命令更改已经存在进程的nice值
进入top后按“r”–>输入进程PID–>输入nice值。
环境变量(envirnment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
创建hello.cpp文件
- #include<iostream>
- int main()
- {
- std::cout<<"Hello world"<<std::endl;
- return 0;
- }
编译后运行
我们分别带路径和不带路径运行,发现带路径就可以运行,而不带路径无法运行。
这个时候就有个问题?
为什么有些指令可以直接执行(例如ls、cd等等),不需要带路径,而我们的二进制程序需要带路径才能执行?
如果我们的程序所在路径加入环境变量PATH当中会发生什么呢?
我们发现确实不用带路径就可以运行了 。这个时候我们又有问题了。
为啥这个时候有可以不带路径了,我只是把mybin的路径加入到环境变量中而已?
我们在启动shell的时候就会自动执行的一个可执行程序
在C语言中我们学到了指针数组,就是存放指针的数组,那么存放的就是各种环境变量的首地址,通过找到环境变量的首地址就可以找到对于的环境变量。
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
- #include<stdio.h>
- int main(int argc,char* argv[],char* env[])
- {
- //argc : 命令行参数的个数, 本质上就是argv数组的元素个数
- //argv :具体的命令行参数
- // envp : 环境变量的值
- int i = 0;
- for(i=0;i<argc;i++)
- {
- printf("%s\n",argv[i]);
- }
- for(i=0;env[i]!=NULL;i++)
- {
- printf("%s\n",env[i]);
- }
- return 0;
- }
- #include<stdio.h>
- int main(int argc,char* argv[])
- {
- extern char** environ;
- for(int i=0;environ[i]!=NULL;i++)
- {
- printf("%s\n",environ[i]);
- }
- return 0;
- }
- #include<stdio.h>
- #include<unistd.h>
- #include<stdlib.h>
- int main()
- {
- printf("%s\n",getenv("PATH"));
- return 0;
- }
本地变量
但是,有个问题我使用 echo $a ,为什么可以查看到本地变量 a 呢?
我们再来实验一下,我们直接将环境变量搞挂掉。
我们发现 ls、cat 等命令无法使用了,但是 echo 和 pwd 还是可以使用的,为啥呢?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。