一、进程的调度算法.
(1) 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
(2) 系统调用在使用上,功能比较基础,对用户的要求也比较高,所以,开发者可以对部分系统调用进行适度封装,从而形成库,从而很有利于更上层用户或者开发者进行二次开发。
(3) 操作系统是做管理的,管理者与被管理者不直接接触,管理者通过数据对被管理者进行决策。
二.理解task-struct结构体中的各个字段的含义
为了描述一个进程的状态,为每一个进程分配pid编号。
Task-struct是linux内核的一种数据结构,它会被封装到RAM(内存)里并且包含着进程的信息。
(1) task-struct的内容分类
标示符:描述本进程的唯一标识符,用来区别其他进程
状态:任务状态,退出代码,退出信号等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他程序共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
(2) 通过系统调用获取进程标识符
# include<stdio.h>
# include<sys/types.h>
# include<unistd.h>
int main()
{
printf("pid:%d\n",getpid());
printf("ppid:%d\n",getppid());
return 0;
}
(3) 通过系统调用创建进程fork
1‘
# include<stdio.h>
# include<sys/types.h>
# include<unistd.h>
int main()
{
int ret=fork();
printf("helloproc:%d,ret:%d\n",getpid(),ret);
sleep(1);
return 0;
}
‘2‘
# include<stdio.h>
# include<sys/types.h>
# include<unistd.h>
int main()
{
int ret=fork();
if(ret<0){
perror("fork");
return 1;
}
else if(ret==0){
printf("I amchild:%d,ret:%d\n",getpid(),ret);
}
else{
printf("I amfather:%d,ret:%d\n",getpid(),ret);
}
sleep(1);
return 0;
}
二、模拟实现僵尸进程, 孤儿进程的场景
1、 僵尸进程
# include<stdio.h>
# include<stdlib.h>
int main()
{
pid_t pid=fork();
if(pid<0){
perror("fork");
return 1;
}
else if(pid>0){
printf("parent[%d] issleeping\n",getpid());
sleep(30);
}
else{
printf("child[%d] is beginz\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
2、 孤儿进程
# include<stdio.h>
# include<stdlib.h>
# include<unistd.h>
int main()
{
pid_t pid=fork();
if(pid<0){
perror("fork");
return 1;
}
else if(pid==0){
printf("I amchild,pid:%d\n",getpid());
sleep(10);
}
else{
printf("I amparent,pid:%d\n",getpid());
sleep(3);
exit(0);
}
return 0;
}
三、使用setenv, export等环境变量相关的函数和命令
1、 通过代码获取环境变量
(1)
# include<stdio.h>
int main(int argc,char *argv[],char *envp[])
{
int i=0;
for(;envp[i];i++){
printf("%s\n",envp[i]);
}
return 0;
}
(2)通过第三方变量获取
# include<stdio.h>
int main(int argc,char *argv[],char *envp[])
{
extern char **environ;
int i=0;
for(;environ[i];i++){
printf("%s\n",environ[i]);
}
return 0;
}
2.通过系统调用获取环境变量
(1)
# include<stdio.h>
int main()
{
printf("%s\n",getenv("PATH"));
return 0;
}
3.export环境变量
输入代码:
# include<stdio.h>
# include<stdlib.h>
int main()
{
char *env=getenv("MYENV");
if(env){
printf("%s\n",env);
}
return 0;
}
没有任何输出结过
导出环境变量后,结果有了