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. 僵尸进程:当前进程已经退出了,但是其父进程没有为其回收资源
相关推荐
十五年专注C++开发1 小时前
Qt之QScopedPointer、QScopeGuard、QScopedValueRollback使用及源码解读
开发语言·c++·qt·qscopedpointer·qscopeguard
fox_lht1 小时前
13.3.测试的组织方式
开发语言·后端·rust
thisiszdy2 小时前
<C++> 多线程基础
c++
·白小白2 小时前
C++ STL 容器 list 底层结构详解
开发语言·c++·list
RSTJ_16252 小时前
PYTHON+AI LLM DAY SIXTY-SIX
服务器·开发语言·python
Chase_______2 小时前
【Java基础 | 11】异常处理进阶:throw、throws、自定义异常与异常链讲清楚
java·开发语言·python
BirdenT2 小时前
20260604紫题训练
c++·算法
tg:;2 小时前
Catkin 常用命令
开发语言·c++·算法
Cx330❀2 小时前
【Linux网络】一文吃透 TCP Socket 编程
linux·运维·服务器·开发语言·网络·tcp/ip