Linux进程


前言

本篇主要是本小白对Linux 有名管道一些笔记,希望对一同学习Linux的伙伴有所帮助。
如有发现错误,欢迎指出,一同进步!


一、进程是什么?

进程是执行一个程序所分配的资源的总称(程序的一次执行过程)
程序:存放在磁盘上的指令和数据的有序集合(文件)
区别:前者是动态的包括创建,调度,执行和消亡,后者是静态的。

二、进程相关指令

1.进程组成成分

进程包括程序和系统数据段
其中程序包含正文段(代码)+用户数据段
系统数据段包含进程控制块+cpu寄存器值+堆栈(局部变量存放于堆栈中)
进程控制块(pcb)
	1.进程标识pid(正整数)
	2.进程用户
	3.进程状态优先级
	4.文件描述符表
PC:program counter 置放下一进程的地址
pid = 0:称为交换进程(swapper)
作用一进程调度
pid = 1:init进程(孤儿进程的收留所)
作用一系统初始化

2.进程类型

交互进程:在shell下启动。前台后台均可运行
前台进程:可以从终端输入,也可以从终端输出
后台进程:无法从终端读取输入,但可以终端输出
批处理进程:和在终端无关,被提交到一个作业队列中以便顺利执行(管理员)
守护进程:和终端无关,一直在后台运行

3.进程状态

运行态:进程正在运行,或准备运行
等待态:进程等待一个时间的发生或者某种资源
	1.可中断(等待过程是否会被信号打断)
	2.不可中断
停止态:进程被中止,收到信号后可继续运行
死亡态(僵尸态):已终止的进程,但pcb没有被释放(放进程返回值,结束方式等)

4.查看进程信息

代码如下(示例):

ps:查看系统进程快照    |:管道符
top:查看进程动态信息
/proc:查看进程详细信息
grep+关键字=搜寻关键字相关进程
例:
	1.ps -ef|grep text
	  ps -ef|more(一频一频输出)
	2.ps -aux|grep text
相关进程态可通过 man ps 查询

三.fork函数(创建进程)

pid_t fork(void);
调用成功返回两次,失败返回-1
成功时父进程返回子进程的进程号(>0,子进程则返回0
通过fork的返回值区别父进程和子进程
getpid():获取当前进程的进程号
getppid():获取父进程的进程号

vfork函数也可以创建子进程
区别:vfork函数直接使用父进程空间,不拷贝
	 只有当子进程以exit等结束函数结束时才执行父进程
	(使用其他语句退出子进程可能会破坏数据)

四.exit函数(结束进程)

void exit(int status)只读取低8void _exit(int status) ->结束进程时不会刷新进程中流打开的缓冲区
结束当前的进程并将status返回
exit结束时会刷新(流)缓冲区,exit(0)结束进程

main函数调用return
进程调用exit(),标准c库
进程调用_exit()或者_Exit,属于系统调用

异常退出 :abort()

五.父子进程

	1.子进程继承了父进程的内容(代码,系统数据,栈等)
	2.父子进程有独立的地址空间,互不影响
	3.若父进程先结束 -> 子进程成为孤儿进程,被init进程收养(init:linux系统
内核创建的第一个,pid =1),子进程变成后台进程
	4.若子进程先结束 -> 父进程如果没有及时回收,子进程变成僵尸进程
(规定由父进程来结束子进程的pcb)
	5.子进程是由fork的下一个语句执行(进程父进程的pc,存放了下一条指令地址)
	6.父子进程谁先执行?
	不确定
	原因:一般若父进程还存放时间片,按理会先执行父进程,慢后再调度子进程
	7.父进程可以多次调用fork子进程

六.exec族函数

1.函数原型

#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg,..., 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[]);

2.exec族函数调用机制

进程调用exec函数执行某个程序
进程当前内容会被指定程序替换(原先进程除进程号不变,取余均被替换)
实现父子进程执行不同程序->
1.父进程创建子进程 
2.子进程调用exec函数族 
3.父进程不受影响

3.exec函数分类

 int execl(const char *path, const char *arg, ...);
  int execle(const char *path, const char *arg,..., char * const envp[]);
  int execv(const char *path, char *const argv[]);
path 执行的程序名称,包含路径
arg..传递给执行的程序的参数列表
例:执行ls命令,显示/etc目录下的所有文件的详细信息
	if(execl("/bin/ls","ls","-a","-l","/etc",NULL<0)
{
	perror("execl");
}
ls:执行的程序名称
-a:显示所有的文件
-l:显示详细信息
/etc:指定目标目录
注意以NULL收尾
-------------------------------------------------------------------
带p的该类函数均可利用修改环境变量来达到在其他目录下也可运行的效果
 int execvp(const char *file, char *const argv[]);
  int execlp(const char *file, const char *arg, ...);
  int execvp(const char *file, char *const argv[]);
  int execvpe(const char *file, char *const argv[],char *const envp[]);
file 执行的程序的名称,在环境变量PATH中查找

pwd 显示当前路径
echo $PATH 显示当前环境变量
export表示在当前环境变量的基础上再添加相关路径
export PATH=$PATH:+路径

七.system函数

int system(const char *command);(会主动创建子进程)

成功时返回命令command的状态值;若该执行无法执行,则返回127;失败返回-1	
当前进程等待command执行结束后才继续执行.
(功能和exec相似,system更好用)

八.popen函数

FILE popen(const char* command,const char *type)
FILE:流指针
type:指定打开方式
popen函数首先创建个管道,再通过fread函数将数据读到缓冲区进行输出
函数功能:得到调用程序的执行结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值