基本进程的应用

一、进程的调度算法.

(1)    在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。

(2)    系统调用在使用上,功能比较基础,对用户的要求也比较高,所以,开发者可以对部分系统调用进行适度封装,从而形成库,从而很有利于更上层用户或者开发者进行二次开发。

(3)    操作系统是做管理的,管理者与被管理者不直接接触,管理者通过数据对被管理者进行决策。

二.理解task-struct结构体中的各个字段的含义

为了描述一个进程的状态,为每一个进程分配pid编号。

Task-structlinux内核的一种数据结构,它会被封装到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;

}

没有任何输出结过

导出环境变量后,结果有了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuruhua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值