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();

相关推荐
Sinclair4 分钟前
安企CMS的安装-宝塔面板部署
服务器·后端
希望奇迹很安静31 分钟前
数通基本实验
运维·服务器·网络
minglie137 分钟前
zynq的linux驱动版终端AtShellDrv
linux
汪汪大队u1 小时前
【无标题】
运维·docker·kubernetes·prometheus
学术小白人2 小时前
第二届智能制造、机器人与自动化国际学术会议(IMRA 2026)
运维·人工智能·机器人·自动化·制造
吴声子夜歌3 小时前
Redis 3.x——集群运维
运维·数据库·redis
欧神附体1233 小时前
在虚拟机搭建本地仓库和网络仓库
linux·运维·服务器
是个西兰花3 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
云泽8084 小时前
飞算 JavaAI 实战:如何自动化生成全流程追溯系统
运维·自动化·vibe coding·飞算javaai·飞算java ai炫技赛
运维大师4 小时前
【Linux运维极简教程】07-磁盘管理与LVM
linux·运维·服务器