linux进程相关的一些概念

理解进程之前要知道的一些知识
冯诺依曼体系结构
1:输入数据和程序的输入设备;
2:记忆程序和数据的存储器;
3:完成数据加工处理的运算器;
4:控制程序执行的控制器;
5:输出处理结果的输出设备。
在这里插入图片描述
操作系统
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。
即操作系统包括
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)

操作系统也可以理解为是一个专门搞管理的软件

系统调用和库函数
由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
进程和进程管理
进程概念:正在执行的程序,程序的一个实例
进程的信息是如何被保存的ne?
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,统称为PCB控制块(包括pid,程序计数器,进程状态,内存指针,上下文数据,进程优先级,IO信息和记账信息),在linux下pcb是一个名为task_struct的结构体.
task_struct是通过链表的形式保存在linux的内核中

查看进程的方法
可以在/proc/这个系统文件下查看,也可以通过top,ps命令查看

每一个进程都有唯一的一个标识符,即为进程标识符(pid)
可以通过getpid查看进程pid,父进程pid通过getppid

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    
    
 printf("pid: %d\n", getpid());
 printf("ppid: %d\n", getppid());
 return 0;
}

我们可以通过系统调用提供的**fork()**创建进程
fork()调用一次,返回两次,这两个返回分别带回它们各自的返回值函数,即子进程和父进程,

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    
    
 int ret = fork();
 if(ret < 0){
    
       //小于0,创建失败
 perror("fork");
 return 1;
 }
 else if(ret == 0){
    
     //==0,child
 printf("I am child : %d!, ret: %d\n", getpid(), ret);
 }else{
    
     //father
 printf("I am father : %d!, ret: %d\n", getpid(), ret);
 }
 return 0;
}

当我们执行这个程序的时候会发现,该程序会有两个结果,好像if else出问题了,其实不是的.
当我们执行fork时,他会把原来的进程信息复制一份产生一个新的进程,即为子进程,(所以if else走了两次,一次为原来的,一次为拷贝的),它们之间代码共享数据独立.
进程状态
进程有很多种状态,下面我列举常见的几种,进程状态可通过ps命令查看
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):已死亡的进程,这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
Z(zombie)-僵尸进程:
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
因此僵尸进程会带来内存泄漏的危害,应该避免.
孤儿进程
当父进程先于子进程退出,该子进程就变为了孤儿进程,但是它会被init进程手痒,即作为init的子进程,不会造成资源的泄漏.
环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
这些参数具有一定的功能, 比如path,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找
和环境变量相关的一些命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量
    我们也可以通过以下代码获取环境变量
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
    
    
/*argc:命令行参数的个数
argv:命令行参数
env:某一个环境变量的值*/
 int i = 0;
 for(; env[i]; i++){
    
          //环境变量指针数组以null结束  
 printf("%s\n", env[i]);
 }
 return 0;
}

获取某个环境变量的值

#include <stdio.h>
#include <stdlib.h>
int main()
{
    
    
 printf("%s\n", getenv("PATH"));   //getenv(const char* name)
                                   //获取名为PATH环境变量的值
 return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45295598/article/details/103447046