C语言--day28
2026/6/20 20:13:25 网站建设 项目流程
进程空间回收策略:
  1. 对于一直处于运行状态,不会结束的进程不需要回收
  2. 进程在执行有结束的情况时回收
进程资源空间回收:
wait

pid_t wait(int *wstatus)

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

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以非阻塞方式回收时,要搭配轮询方式实现

exec函数族

  • 功能:在一个进程中执行另外一个文件

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时,系统将要执行的文件和进程中文本区的指令数据进行替换
  • env : 查看系统中的环境变量
  • whereis 二进制/库 查看二进制。库对应的位置

线程

什么是线程

  • 线程是一个轻量级的进程,用来实现多任务并发
  • 线程是操作系统任务调度的最小单位
  • 线程由某个进程创建

线程的创建

  • 线程由所在进程创建,创建时,进程为其分配独立的栈区空间(默认8M)
  • 同一个进程中的线程,共用所在进程的堆区、数据区、文本区

线程的调度

  • 宏观并行
  • 微观串行

线程消亡

  • 线程退出
  • 回收线程的资源空间

进程和线程的区别

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

线程相关接口

pthread_create()

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

void pthread_exit(void *retval)

  • 功能:结束一个线程
  • 参数:
  • retval :可以用来保存线程退出时传递的参数和return返回的指针类似
  • 注意:
  • 线程退出:
  • 在线程任务中return
  • 在线程任务中pthread_exit
  • 在线程中exit,让所在进程直接退出

phtread_self()

  • 获取当前pid值

pthread_join()

int pthread_join(pthread_t thread, void **retval);

  • 功能:等待回收具有非分离属性的线程
  • 参数:
  • thread:要回收的线程ID;
  • retval:接收回收的线程退出时传递的参数:通过pthread_exit参数,return返回值传递
  • NULL : 不接收参数
  • 返回值:
  • 成功:0
  • 失败:非0

线程的分离属性

分离属性 :

  • 不需要被其他线程回收的线程,称为具有分离属性的线程,结束时可以被操作系统回收

非分离属性:

  • 可以被其他线程回收或者结束的线程称为非分离属性的线程

默认属性:非分离属性

设置线程分离属性:

int pthread_detach(pthread_t thread)

  • 功能:设置线程的分离属性
  • 参数:
  • thread:要设置的线程的线程ID
  • 返回值:
  • 成功:0
  • 失败:!0

线程的互斥机制

  • 多线程访问临界资源时,存在资源竞争问题
  • 临界资源:多个线程可以同时操作的资源,比如:全局变量,共享内存等
如何解决资源竞争问题:
  • 线程的互斥机制:让多个线程在访问临界资源时,具有排他性访问的特性
  • 互斥锁:实现互斥机制
  • 创建互斥锁:pthread_mutex_t
  • 初始化锁:pthread_mutex_init
  • 加锁:pthread_mutex_lock/pthread_mutex_trylock
  • 解锁:pthread_mutex_unlock
  • 销毁锁:pthread_mutex_destroy

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr)

  • 功能:初始化互斥锁
  • 参数:
  • mutex :互斥锁对象地址
  • attr: 锁的属性
  • 返回值:
  • 成功:0
  • 失败:非0

int pthread_mutex_lock(pthread_mutex_t *mutex)

  • 功能:以阻塞方式等待加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex)

  • 功能:以非阻塞方式加锁,如果该锁已被使用,则返回

int pthread_mutex_unlock(pthread_mutex_t *mutex)

  • 功能:解锁/释放锁

int pthread_mutex_destroy(pthread_mutex_t *mutex)

  • 功能:销毁锁

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询