Unix-进程和线程

1.waitpid

pid_t waitpid(pid_t pid, int *wstatus, int options);

The value of pid can be:

< -1 meaning wait for any child process whose process group ID is equal to the absolute value of pid.

eg:

pid = -100

进程组 id = |-100| = 100

-1 meaning wait for any child process.

eg:

pid = -1

等待所有子进程 ---当前进程的所有进程

0 meaning wait for any child process whose process group ID is equal to that of the calling process.

eg:

等待 进程组id = PPID 的进程组中的所有子进程

> 0 meaning wait for the child whose process ID is equal to the value of pid.

eg:

pid = 100

等待 pid 为100的子进程状态改变

options:

WNOHANG 以非阻塞的方式 回收子进程 ---1. 如果是非阻塞 ,在没有子进程状态改变时,此时返回0

  1. 必须配合循环使用 (轮询)

2.exit

exit

_exit

void exit(int status);

功能:

造成进程正常结束

参数:

status //表示退出时带出的状态值

status & 0377 //

exit退出时处理流程:

1.调用 atexit 注册的相关函数

2.刷新所有的stdio的流

#include <unistd.h>

void _exit(int status);

#include <stdlib.h>

void _Exit(int status);

立即结束进程

3.【1】进程和线程的对比

进程(重量级的进程): 更多侧重于 成为 资源分配的单位 ---- 资源分配的基本单位

线程(轻量级的进程): 更侧重于 成为一个 执行单位 ---- 调度执行的最小单位

线程组成:

线程id //long -- 8字节

程序计数器 (program counter) //寄存器 --- 8字节

其它寄存器 // 51 * 8 字节 = 408字节

栈 //8M

【2】进程的组成:

text|data|bss|堆栈| + pcb

线程 --- 主要侧重 去 执行任务 (资源更多的是共享了进程资源)

【3】线程 和 进程之间的关系:

1.线程是依附于进程的

2.进程不存在,相关的线程也不复存在

3.一个进程中,可以创建多个线程

4.进一步提高了并发程度

4.线程的创建

pthread_create //线程创建

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

功能:

创建一个新的线程

参数:

@thread --- 线程id

@attr --- 线程属性 //默认属性 NULL --可结合性

//可分离属性

@start_routine ---线程执行函数//线程回调函数 --- 提现线程任务执行的部分

@arg ---这是传给 start_routine 函数的参数

void * do_something(void *arg) //线程执行函数

{

}

返回值:

成功 0

失败 返回错误码

创建出来的线程 --- 次线程 子线程

原先main函数对应执行流 --- 主线程

【1】利用函数指针的数组创建多线程

【2】通过传入地址可使多线程修改同一个值(需要传入数值的通用地址并进行强制转换),如果传入值就不可以

The new thread terminates in one of the following ways:

* It calls pthread_exit(3),

specifying an exit status value that is available to another thread

in the same process that calls pthread_join(3).

* It returns from start_routine().

This is equivalent to calling pthread_exit(3) with the value supplied in the return statement.

* It is canceled (see pthread_cancel(3)).

* Any of the threads in the process calls exit(3), or the main thread performs a return from main().

This causes the termination of all threads in the process.

pthread_exit

void pthread_exit(void *retval);

功能:

结束线程

参数:

retval --- 带出的值的 地址

通过传入地址可使多线程修改同一个值(需要传入数值的通用地址并进行强制转换),如果传入值就不可以

传入字符串地址直接可以打印字符串

相关推荐
captain37620 分钟前
MyBatis Plus(1)
java·服务器·mybatis
科创致远27 分钟前
ESOP 电子作业指导书 WiFi 网络应用实测报告
运维·服务器·网络
香蕉大香蕉(06敬畏市场)44 分钟前
MySQL 单点详解(08)
java·数据库·mysql·面试·八股
重生之小比特1 小时前
【Linux系统】17 库制作与原理(下)
linux·运维·服务器
thefool1122661 小时前
HTTPS协议
java
acd120091 小时前
Nginx 反向代理的缓冲区坑:后端响应大时接口偶发 502
java·运维·nginx
装不满的克莱因瓶1 小时前
支付订单成功异步MQ权益发放设计和开发
java·架构·系统架构·rabbitmq·硬件架构
程序员清风1 小时前
AI 编程助手的权限边界:文件、命令、密钥与人工确认
运维·服务器·网络
wacsii1 小时前
【Linux进程(二)】深入 Linux 内核:进程状态切换与底层数据结构的秘密
linux·服务器
高冷小鱼殿下1 小时前
内部类Lambda与枚举
java·开发语言