Linux进程

文章介绍了进程的基本概念,包括进程与程序的区别,以及一系列用于查看和管理进程的Linux命令,如top、ps、kill等。同时,讨论了进程的创建、调度机制(如时间片轮转),进程的状态转换,并详细阐述了进程函数接口如fork、wait、exit等的作用。此外,还提到了环境变量的获取和设置,以及exec函数族用于执行新代码的功能。
摘要由CSDN通过智能技术生成

一、进程概念

进程:程序动态执行的过程,包括创建、调度、消亡

程序:存放在外存中的一段代码的集合

二、进程相关命令

1.top

根据CPU占用率动态查看进程信息

2.ps -ef

查看当前时刻所有进程的信息

3.ps -aux

查看当前时刻进程的信息

4.pstree

查看进程关系

5.kill -9 PID

杀死PID对应的进程

6.killall -9 进程名

杀死进程名对应的所有进程

三、进程内容

  • 进程的创建

进程被执行后,操作系统为进程分配进程空间:

1.文本段

文本区

代码、指令

2.数据段

数据区

字符串常量

未初始化静态变量/全局变量

已初始化静态变量/全局变量

3.系统数据段

堆:程序手动管理malloc 申请 free释放

栈:操作系统管理

进程空间:是独立的,每个进程占用独立的内存空间,不同的进程不存在共享空间

  • 进程的调度

宏观并行,微观串行

内核进程调度算法

1.先来先执行,后来后执行

2.高优先级调度算法

3.时间片轮转调度算法

时间片:CPU在某段任务执行的一段时间

4.多级队列反馈调度算法

5.负载均衡调度算法

  • 进程的状态

R运行态、就绪态

S 睡眠态、可唤醒等待态

D不可唤醒等待态

T 暂停态

Z僵尸态

X结束态

四、进程相关函数接口

1.fork

pid_t fork(void);
  功能:
    创建一个子进程
  参数:
    缺省
  返回值:
    成功在父进程中返回子进程PID
        在子进程中返回0 
    失败返回-1 
2.getpid

 pid_t getpid(void);
  功能:
    获得调用该函数的进程的PID
3.getppid

 pid_t getppid(void);
  功能:
     获得调用该函数父进程的ID

写时拷贝:

调用fork创建子进程,子进程空间不会立即被创建,只有当父进程或子进程空间中数据发生修改时,才会触发拷贝

4.exit

void exit(int status);
功能:
进程退出 
参数:
status:进程结束的状态
返回值:
缺省
5._exit

    void _exit(int status);
功能:
进程退出 
参数:
status:进程结束的状态 
返回值:
缺省 

僵尸进程:

代码执行结束,空间没有被回收

1.父进程先结束,子进程会成为孤儿进程,被系统进程收养,子进程再结束,被系统进程回收空间

2.父进程在进程结束时回收子进程空间

6.wait

pid_t wait(int *wstatus);
功能:
回收子进程空间
参数:
wstatus:存放子进程结束状态空间首地址
返回值:
成功返回回收到子进程的ID
失败返回-1 

wait具有阻塞功能


WIFEXITED(wstatus)
判断是否正常结束 
WEXITSTATUS(wstatus)
获得正常结束时返回的值 
WIFSIGNALED(wstatus)
判断是否被信号杀死
WTERMSIG(wstatus)
获得杀死进程任务的信号编号

作用:

1.回收子进程空间

2.具有同步功能

7.waitpid


pid_t waitpid(pid_t pid, int *wstatus, int options);
  功能:
    回收子进程空间
  参数:
    pid:想要回收的子进程空间对应的PID
        -1回收任意一个子进程空间
    wstatus:存放进程状态空间首地址
    options:
        0:阻塞回收子进程空间
        WNOHANG:非阻塞回收子进程空间
  返回值:
    成功返回回收到的子进程空间
    失败返回-1 
    非阻塞形式没有回收到子进程空间返回0 

wait(NULL) 等价于 waitpid(-1, NULL, 0)

7.exec函数族:


  extern char **environ;
      int execl(const char *path, const char *arg, ... /* (char  *) NULL */);
      int execlp(const char *file, const char *arg, ... /* (char  *) NULL */);
      int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);
      int execv(const char *path, char *const argv[]);
      int execvp(const char *file, char *const argv[]);
      int execvpe(const char *file, char *const argv[], char *const envp[]);

  功能:
    利用进程空间执行一段新的代码
    l:参数以列表形式传递
    p:在系统路径下查找文件
    e:执行新代码时,更新环境变量
    v:参数以指针数组形式传递
  参数:
  
  返回值:
    失败返回-1 

execlp:

利用进程空间执行一个系统命令

7.getenv

char *getenv(const char *name);
  功能:
    获得环境变量name对应的值
  参数:
    name:环境变量名
  返回值:
    成功返回环境变量对应的值
    失败返回NULL
8.setenv

int setenv(const char *name, const char *value, int overwrite);
  功能:
    设置环境变量的值
  参数:
    name:环境变量名
    value:环境变量的值
    overwrite:
        0值 如果变量名存在不会替换旧值
        非0值   如果变量名存在会替换旧值
  返回值:
    成功返回0 
    失败返回-1 

fork + exec

当前进程启动一个新的进程任务

附加:system


 int system(const char *command);
  功能:
    执行一条command shell命令 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值