进程(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)存于内核中
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/15970489.html