C语言--day28

张开发
2026/6/9 1:32:21 15 分钟阅读

分享文章

C语言--day28
进程空间回收策略对于一直处于运行状态不会结束的进程不需要回收进程在执行有结束的情况时回收进程资源空间回收waitpid_t wait(int *wstatus)功能阻塞等待回收僵尸态进程参数wstatus保存回收的子进程的退出状态返回值成功返回回收到的子进程的ID失败-1WIFEXITED(wstatus) 是不是正常结束WEXITSTATUS(wstatus) 使用这个宏去拿exit结束状态WIFSIGNALED(wstatus) 是不是收到了信号而终止的WTERMSIG(wstatus) 如果是信号终止的那么是几号信号waitpidpid_t waitpid(pid_t pid, int *status, int options)功能回收指定进程的资源和wait功能相似比wait更灵活参数pid-1 回收指定进程组内的任意子进程 -100.等待GID100的进程组中的任意子进程-1 回收任意子进程组内外0 回收和当前调用waitpid一个组的所有子进程组内 0 回收指定ID的子进程status 子进程退出时候的状态如果不关注退出状态用NULLoptions 选项0 表示回收过程会阻塞等待WNOHANG 表示非阻塞模式回收资源。返回值成功 返回接收资源的子进程pid失败 -1设定为非阻塞且没有回收到子进程返回0waitpid(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, -lv : 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注意编译和链接时要加-lpthread 表示链接线程库线程执行时线程所在的进程不能先退出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要回收的线程IDretval接收回收的线程退出时传递的参数通过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_destroyint pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)功能初始化互斥锁参数mutex 互斥锁对象地址attr 锁的属性返回值成功0失败非0int 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)功能销毁锁

更多文章