進程回收
wait
原型:pid_t wait(int *wstatus); 功能:回收子進程空間 參數:wstatus:存放子進程結束狀態空間的首地址 返回值:成功返回回收到的子進程的PID失敗返回-1WIFEXITED(wstatus):測試進程是否正常結束 WEXITSTATUS(wstatus):獲得進程退出的值 WIFSIGNALED(wstatus):測試進程是否被殺死 WTERMSIG(wstatus):獲得殺死進程的編號
- wait具有阻塞等待的功能,等到有子進程結束才會回收子進程繼續向下執行
- wait可以實現多任務得到同步
waitpid
原型:pid_t waitpid(pid_t pid, int *wstatus, int options); 功能:回收指定的子進程空間 參數:pid:要回收的進程的PID(-1表示回收任意子進程)wstatus:存放子進程結束狀態空間首地址options:0 阻塞回收WNOHANG 非阻塞回收 返回值:成功返回回收到的子進程PID失敗返回-1指定的子進程空間未結束,返回0waitpid(-1, NULL,0)等價于wait(NULL)
- waitpid可以非阻塞回收子進程空間
- waitpid可以回收指定子進程空間
1.exec函數族
1.1 exec函數族
- 利用進程空間執行另一份代碼
- exec常搭配fork使用,fork創建新的子進程,exec讓子進程執行自己的代碼
extern char **environ;int execl(const char *path, const char *arg, .../* (char *) NULL */); int execlp(const char *file, const char *arg, .../* (char *) NULL */); int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[]*/); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[],char *const envp[]);l:參數以列表的形式傳遞 p:在系統變量PATH對應的目錄下查找文件 v:參數以指針數組的形式傳遞 e:執行新代碼是更新環境變量
1.2 主函數傳參
主函數形式
void main(void); int main(void); int main(int argc, const char *argv[]); int main(int argc, const char **argv);argc:傳入參數的個數 argv:存放每一個傳入參數指針的數組名argv[0] = "./a.out" argv[1] = "hello" argv[2] = "world" argv[3] = "how" argv[...] = ... argv[argc] = ...
1.3 sytem函數
原型:int system(const char *command); 功能:在代碼運行command命令 參數:command:shell命令字符串首地址 返回值:成功返回0失敗返回-1
2.線程
2.1 基本概念
線程是一個輕量級的進程
- 線程本質就是一個進程
- 線程和進程不完全一致,輕量指空間,進程空間和線程空間空間管理方法不同
2.2 進程和線程的區別
- 線程本質是進程,線程是任務創建、調度、回收的過程
- 進程空間:文本段 + 數據段 + 系統數據段
- 線程空間:
1.線程必須位于進程空間內部,沒有進程,線程無法獨立存在
2.一個進程中的所有線程共享文本段 + 數據段 + 堆區,獨享棧區
3.線程獨享的棧區默認8M
4.一個進程中的多個線程切換調度任務時,資源開銷少
- 進程和線程的區別
1.線程是CPU任務調度的最小單元
2.進程是操作系統資源分配的最小單元
2.3 多進程和多線程的優缺點
1.多線程和多進程對比:
場景 多進程 多線程 對比 效率 多進程切換需要重新映射物理地址,占用資源開銷較大 多線程在同一進程空間內部切換任務,占用資源開銷較小 多線程 > 多進程 通信 多進程沒有共享空間,需要使用進程間通信的方法來完成通信 多線程有共享空間,只需要定義共享空間變量完成數據交換即可實現通信 多線程 > 多進程 資源競爭 多進程沒有共享空間,不存在資源競爭 多線程使用共享空間,需保證資源使用的互斥性,防止多線程對共享資源產生競爭 多進程 > 多線程 安全 多進程空間獨立,一個進程的崩潰不會影響其余進程 多線程共用一個進程空間,一個線程異常崩潰,可能引發進程異常退出,導致其余線程也無法執行 多進程 > 多線程
2.4 線程的調度
與進程調度保持一致
宏觀并行,微觀串行
2.5 線程的消亡
線程結束需要回收線程空間,否則會產生僵尸線程
2.6 線程的函數接口
1.函數接口
進程接口 線程接口 fork pthread_creat exit pthread_exit wait pthread_join
pthread_creat
原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg); 功能:在進程中創建一個線程 參數:thread:存放線程ID空間的首地址attr:線程的屬性,默認屬性NULLstart_routine:線程函數的入口arg:線程傳入的參數 返回值:成功返回0失敗返回錯誤碼
pthread_self
原型:pthread_t pthread_self(void); 功能:獲得調用該函數的ID號
pthread_exit
原型:void pthread_exit(void *retval) 功能:結束當前線程任務 參數:retval:線程結束的值
pthread_join
原型: int pthread_join(pthread_t thread, void **retval); 功能:回收線性空間 參數:thread:要回收的線程的IDretval:存放線程結束狀態空間的首地址 返回值:成功返回0失敗返回錯誤碼
- tid對應的線程只要不退出,pthread_join 阻塞等待結束回收線程空間
- pthread_join具備同步的功能