Linux 应用软件编程 多任务并发

二、多任务并发

单任务:程序运行起来,只能处理一件事情

多任务:程序运行起来,可以同时处理多件事情

1.进程

7.进程相关的函数
2.进程的消亡

进程资源空间回收:

wait

cpp 复制代码
pid_t wait(int *wstatus);
功能:阻塞等待回收僵尸态进程
参数:
	wstatus:保存回收的子进程的退出状态
返回值:
	成功:返回回收到的子进程的ID
	失败:-1
WIFEXITED(wstatus)  是不是正常结束   
WEXITSTATUS(wstatus) 使用这个宏去拿exit结束状态
WIFSIGNALED(wstatus) 是不是收到了信号而终止的            
WTERMSIG(wstatus)如果是信号终止的,那么是几号信号。

waitpid

cpp 复制代码
pid_t waitpid(pid_t pid, int *status, int options);
功能:回收指定进程的资源
	 和wait功能相似,比wait更灵活
参数:
	pid:
		<-1 回收指定进程组内的任意子进程 (-100.等待GID=100的进程组中的任意子进程)
		-1 回收任意子进程,组内外
		0 回收和当前调用waitpid一个组的所有子进程,组内 
		> 0 回收指定ID的子进程
	
	status 子进程退出时候的状态,
	  		如果不关注退出状态用NULL;
	options 选项:
	  		0  表示回收过程会阻塞等待
			WNOHANG 表示非阻塞模式回收资源。
返回值:
	成功 返回接收资源的子进程pid
	失败  -1
	设定为非阻塞且没有回收到子进程返回0 

waitpid(0,&status,0)   //默认阻塞  ==wait(&status);
waitpid(0,&status,WNOHANG); // 非阻塞方式

注意:使用waitpid以非阻塞方式回收时,要搭配轮询方式实现。
8.exec函数族
cpp 复制代码
功能:在一个进程中执行另外一个文件
int execl(const char *path, const char *arg, ...
                       /* (char  *) NULL */);
 功能:可以执行任意可执行文件
 参数:     
 	path:要执行的文件的路径和名称
 	arg:执行该文件需要的参数
int execlp(const char *file, const char *arg, ...
                       /* (char  *) NULL */);
功能:执行环境变量保存的系统路径下的可执行文件
参数:
	file:需要执行的文件的名称
	arg:执行该文件需要的参数
int execle(const char *path, const char *arg, ...
                       /*, (char *) NULL, char * const envp[] */);
int execv(const char *path, char *const argv[]);
功能:可以执行任意可执行文件
 参数:     
 	path:要执行的文件的路径和名称
 	argv:执行该文件需要的参数存放的指针数组
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],
                       char *const envp[]);

	l : list-----》列表         "ls", "-l"
	v : vector---->容器(数组)  
    p :path  ----》路径 exec会自动从PATH环境变量所保存的路径下去寻找
  	e :env   ----》环境变量

exec原理:当执行exec时,系统将要执行的文件和进程中文本区的指令数据进行替换。

cpp 复制代码
env : 查看系统中的环境变量
whereis 二进制/库   查看二进制。库对应的位置

2.线程

1.什么是线程

线程是一个轻量级的进程,用来实现多任务并发。

线程是操作系统任务调度的最小单位。

线程由某个进程创建。

2.线程的创建

线程由所在进程创建,创建时,进程为其分配独立的栈区空间(默认8M)。

同一个进程中的线程,共用所在进程的堆区、数据区、文本区。

3. 线程的调度

宏观并行

微观串行

4.线程消亡

线程退出

回收线程的资源空间

5.进程和线程的区别*

|-----------------------|----------------------|
| 进程 | 线程 |
| 正在执行的程序 | 轻量级的进程 |
| 操作系统资源分配的最小单位 | 操作系统任务调度的最小单位 |
| 资源空间消耗大(0-4G虚拟内存空间) | 资源空间消耗小(栈区独立,其他区域共享) |
| 进程效率低(创建、任务切换) | 线程效率高(创建、任务切换) |
| 进程安全性高(进程空间独立) | 线程安全性低 |
| 进程间通信较复杂,需要用到IPC机制 | 线程间通信简单(全局变量) |
| 在相同资源平台下,多进程的并发量少于多线程 | |

6.线程相关接口

pthread_create();

cpp 复制代码
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
功能:创建并启动一个线程
参数:
	thread :保存线程ID的变量地址
	attr :设置线程属性
		NULL :按照默认属性创建
	start_routine :函数指针,线程启动后要执行的任务的函数地址(线程任务函数)
	arg :传递给线程任务函数的参数
返回值:
	成功:0
	失败:非0

注意:1.编译和链接时要加-lpthread,表示链接线程库。

2.线程执行时,线程所在的进程不能先退出。

pthread_exit();

phtread_self();

pthread_join();

相关推荐
小生不才yz2 分钟前
Shell脚本精读 · S02-03 | 词拆分、通配符与未加引号的变量
linux
2601_961845429 分钟前
法考真题及答案解析|历年真题|资料已整理
linux·windows·ubuntu·macos·centos·gnu
A_humble_scholar11 分钟前
Linux(七)调度器:从硬件矛盾到进程切换的底层逻辑
linux·服务器·网络
Urbano16 分钟前
工装 T 恤、Polo 衫全生产工序、痛点解析及多品牌自动化设备应用方案
运维·自动化
AOwhisky26 分钟前
Redis 学习笔记(第一期):概述、安装配置与核心理论
运维·数据库·redis·笔记·学习·云计算
AOwhisky1 小时前
Redis 学习笔记(第四期):高可用与集群(哨兵 + Cluster + 容器化)
linux·运维·数据库·redis·笔记·学习·缓存
零陵上将军_xdr1 小时前
Shell脚本入门:从Hello World到变量的灵活运用
linux
C语言小火车1 小时前
嵌入式Linux应用开发技术栈完全指南
linux·运维·服务器
IT WorryFree2 小时前
FortiGate 排错常用OID速查表(含Trap OID+轮询OID)
运维·网络
m0_738120722 小时前
渗透测试基础——基于Docker的Rsync服务靶场搭建与原理讲解
运维·服务器·网络·安全·web安全·docker·容器