进程(1)

定义

进程是正在运行的程序的实例
既是基本的分配单元也是基本的执行单元
分单道多道程序设计
多道程序设计模型中CPU为纳秒级(宏观,微观上,CPU上运行的程序只有一个)

并行:同一时刻,多条指令在多个处理器上执行

并发:一个处理器多个进程指令被极快速切换,宏观上并发执行

PCB:进程控制块 struct task_struct

状态:运行态,就绪态,阻塞态(新建态,终止态)
进程查看shell cmd

快照
ps aux/ajx
实时
top M/P/T/U/R
杀死进程
kill (-9)pid


函数

获取

getpid();
getppid();

创建子进程
父子进程交替执行,栈空间复制后可互不影响

pid_t fork(void)

exec函数族
根据文件名找到可执行文件,替代进程的内容(金蝉脱壳)

int execl(const char *path, const char *arg,···);
#path 路径 
#arg 参数列表:第一个名称,接下来参数列表,以NULL结束
调用成功没有返回值(除内核区被替换)

int execlp(const char *path, const char *arg,···);
#会到环境中查找可用的环境变量(env)

退出
可通过宏传递

c
void exit(int *status)
Linux
void _exit(int *status)

退出相关宏函数

WIFEXITED (status)非0,进程正常退出
WEXITSTATUS (status)如果上宏为真,获取进程退出的状态 (exit的参数)
WIFSIGNALED(status)非0,进程异常终止
WTERMSIG(status)如果上宏为真,获取使进程终止的信号编号
WIFSTOPPED (status)非o,进程处于暂停状态
WSTOPSIG(status)如果上宏为真,获取使进程暂停的信号的编号wIFCONTINUED (status)非0,进程暂停后已经继续运行
WIFCONTINUED (status)非0,进程暂停后已经继续运行

等待
一次清理一个

父进程阻塞等待
pid_d wait(int *wstatus);


pid_d waitpid(pid_t pid, int *wstatus,int options);
/*pid>0 某个子进程的pid
pid=0 回收当前进程组的所有值进程
pid = -1 回收所有的子程序,相当于wait()
pid < -1 回收指定进程组中的子进程
options:
0:阻塞
WNOHANG:非阻塞
返回值
>0 :返回子进程的id
=0 :非阻塞
=-1 错误或者没有子进程了
*/

内存映射

#include <sys/ mman.h>
void *mmap(void *addr,size_t length,int prot, int flags,int fd, off_t offset);
#将文件或设备的数据映射到内存中
/* a*addr: NULL,系统指定
length要映射的数据的长度,建议使用文件的长度
port权限 PORT_EXEC,PORT_READ,PORT_WRITE,PORT_NONE要操作映射内存必须有读文件
建议与open中一致
flags同步 MAP_SHARED,MAP_PRIVATE
fd文件描述符,不能与port冲突
*/

int munmap (void *addr, size_t length);
#释放内存映射

匿名映射
不需要文件实体进行的关系进程间的映射

mmap(NULL,len,PROT_READ | PROT_WRITE,MAP_SHARED|MAP_ANOMINOUS,fd,0);

mmap调用失败的原因
*length == 0
*port只定了写权限
mmap后关闭文件描述符没有影响
ptr越界会产生段错误


进程间通信(IPC)

目的:数据传输、通知事件、资源共享(互斥,同步)、进程控制(如DEBUG)

匿名管道

例子: ls | wc -l
是内核内存中的缓冲区,有名拥有文件的特质,匿名管道没有文件实体,一个管道是一个字节流
从管道中传递的数据是顺序的,
一端写入。一端读取,是半双工的
是一个环(循环队列)


创建匿名管道

int pipe(int pipefd[2]);
# int pipefd[2] 传出参数,[0]读端,[1]写端,成功返回0,失败返回-1
# 匿名管道只能用于具有关系的进程之间的通信(父子进程,兄弟进程)
# 管道空read阻塞,满write阻塞

获取管道长度
long fpathconf(pipefd,_PC_PIPE_BUF);

int pipe2(int pipefd[2],int flags);

有命管道(FIFO)

提供了一个路径名与之关联,不相关的进程也能交换数据
内容存放在内存中
进程退出后保留在系统中
先进先出

mkfifo   //cmd
判断存在
access("fifo1“,F_OK);

int mkfifo(const char *pathname , mode_t mode);
 
只读,只写都会堵塞,另外一方加入才会继续使用(或者关闭)

杂项

多进程GDB调试

默认父进程,设置子进程
set follow-fork-mode child

进程脱离
set detach-on-fork on/off

查看
info inferiors

改变
inferior 9 

脱离调试
detach inferiors 1

进程控制

孤儿进程:父进程运行结束(设置为init),子程序还在运行
僵尸进程: 父进程尚未回收。子进程残留资源(PCB)存于内核中

posted @ 2022-03-14 21:21  InsiApple  阅读(26)  评论(0编辑  收藏  举报