C++多线程实现

进程的创建过程,是子进程通过拷贝父进程得到的,新进程的创建直接拷贝父进程的资源,只需改变很少部分的数据即可,保留了父进程的大部分的数据信息(遗传基因),所以这个拷贝过程,系统通过一个函数fork来自动完成

1、进程的创建:fork

bash 复制代码
pid_t fork(void);
功能:通过拷贝父进程得到一个子进程
参数:无
返回值:成功在父进程中得到子进程的pid,在子进程中的到0,失败返回-1并置位错误码
  1. 无返回值的案例
bash 复制代码
 int main()
 {
    printf("ni hao zxp\n");
    fork();
    printf("hello\n");
    while(1);
    return 0;
 }

运行结果

bash 复制代码
ni hao zxp
hello
hello
  1. 多个fork创建进程
    如果不关注返回值的话,有n个fork,会产生2^n个进程
  2. 有返回值
bash 复制代码
int main(int argc, const char *argv[])
{
    pid_t pid = -1;
    pid = fork();            //创建一个子进程,父进程会将返回值赋值给父进程中的pid变量
                            //子进程会将返回值赋值给子进程中的pid变量
    printf("pid = %d\n", pid);      //对于父进程而言会得到大于0的数字,对于子进程而言会
得到0
    //对pid进程判断
    if(pid > 0)
   {
        //父进程要做执行的代码
        printf("我是父进程\n");
   }else if(pid == 0)
   {
        //子进程要执行的代码
        printf("我是子进程\n");
   }else
   {
        perror("fork error");
        return -1;
   }
    while(1);          //防止进程结束
    return 0;
}
bash 复制代码
pid=2121
我是父进程
pid=0
我是子进程

2、父进程号的获取:getpid、getppid

pid_t getpid():获取当前进程的进程号

pid_t getppid():获取当前进程的父进程pid号

3、进程退出:exit/_exit

exit属于库函数,使用该函数退出进程时,会刷新标准IO的缓冲区后退出

_exit属于系统调用(内核提供的函数),使用该函数退出进程时,不会刷新标准IO的缓冲区

4、进程资源的回收:wait、waitpid

wait是阻塞回收任意一个子进程的资源函数

waitpid:可以阻塞,也可以非阻塞完成对指定的进程号进程资源回收

bash 复制代码
 pid_t waitpid(pid_t pid, int *status, int options);
 功能:可以阻塞也可以非阻塞回收指定进程的资源
 参数1:进程号
        >0 :表示回收指定的进程
        =0:表示回收当前所在的进程组中的任意一个子进程
        =-1:表示回收任意一个子进程
        <-1:表示回收指定进程组中的任意一个子进程,进程组id为给定的pid的绝对值
  参数2:接收子进程退出时的状态,获取子进程退出时的状态与0377进行位与后的结果,如果不愿意接收,可以填NULL
  参数3:是否阻塞
        0:表示非阻塞等待
        WNOHANG:表示非阻塞
  返回值:
        >0:返回的是成功回收的子进程pid号
        =0:表示本次没有回收的子进程
        =-1:出错并置位错误码

5、僵尸进程和孤儿进程

  1. 孤儿进程:当前进程还正在运行,其父进程已经退出了
  2. 僵尸进程:当前进程已经退出了,但是其父进程没有为其回收资源
相关推荐
郝学胜-神的一滴2 小时前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程
Ramble_Naylor3 小时前
只借不占:Rust 的引用与借用
开发语言·rust
FreeTinker3 小时前
Java文件服务器的技术选型与实现路径:从嵌入式工具到企业级系统
java·服务器·开发语言
2501_906565123 小时前
小创 · 智能助手
开发语言·c#
汉克老师3 小时前
CSP-J 初赛(以满分为目标):第十五课《结构体、排序与自定义比较——从“给数字排队”到“给一群人排队”》
c++·csp-j·小学生·学c++编程
benchmark_cc3 小时前
1000只ETF的5分钟K线如何批量获取?QuantDash分页策略与高性能Python实践
开发语言·人工智能·爬虫·python·算法·quantdash·量化数据源
Coodor3 小时前
如何在web浏览器使用js操作CPU卡
开发语言·前端·javascript·cpu卡
我星期八休息3 小时前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
大模型码小白4 小时前
AI 提示词专栏:使用系统指令(System Prompt)实现全局约束
java·大数据·运维·开发语言·人工智能·python·prompt