c语言中创建多进程

进程的组成:
text | data | bss | 堆 栈 | 系统数据|

1.进程的诞生
[1].fork() // fork 叉子
  注:
    fork创建子进程的过程
    [1].通过复制调用fork的进程 来实现新进程的创建
        新进程是调用进程的复制品
        新进程被称为 "子进程"
        原先的调用进程 称为 "父进程"

    [2].复制了哪些东西?
        a.原先进程中有哪些东西?
          |text | data | bss | 堆 栈 | 系统数据|
        复制之后:
        新的进程获得了一份原先进程的组成的各个部分
          |text | data | bss | 堆 栈 | 系统数据|

        b.梳理:
          代码段 和 数据段
       
        c.拷贝了一些寄存器的值
          pc (Program Counter) //指向下一条要执行的指令

#include <stdio.h>

#include <unistd.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{

    pid_t pid;
    int status = 0; //没有初始化时 ,status为随机值

    pid =fork();//创建子进程 --- pc 程序计数器
                   // 创建子进程时,子进程也拷贝了父进程的pc值
                   // 指向了fork之后的下一条语句
                   // 此处 fork 之后的下一句为
                   // 赋值语句
                  //  将:fork的返回值赋值给pid变量


    if(pid < 0)//如果pid小与0表示创建子进程失败

    {
        perror("fork fail");
        exit(EXIT_FAILURE);
    }
   
    if(pid > 0) //父进程
    {

       while(1)
       {
           printf("father pid = %d\n",getpid());
           sleep(1);

           //wait(&status); //收尸 ---回收资源的同时,可以接收子进程的退出状态值
           waitpid(-1,&status,WNOHANG|WUNTRACED|WCONTINUED);
           if(WIFEXITED(status))
               printf("status = %d\n",WEXITSTATUS(status));
           if(WIFSIGNALED(status)) //如果子进程是被信号结束了 ,则为真
               printf("signal status = %d\n",WTERMSIG(status));
           //R->T
           if(WIFSTOPPED(status))
               printf("stop sig num = %d\n",WSTOPSIG(status));
           //T->R
           if(WIFCONTINUED(status))
               printf("continue......\n");
       }
    }else if(pid == 0)//子进程
    {
        while(1)
        {
            printf("child exit...\n");
            sleep(1);
           
       //     exit(89); //退出时 给父进程 返回一个 退出状态值
        }
    }
    return 0;

}


注意:

 父进程中的wait()阻塞方法它会等待子进程执行完,帮子进程进行收尸处理(如释放它所占用的资源)并且它只能处理一个子线程为了处理所有子线程可以把wait放在while中

 还有时创建的进程会接着fork语句后面执行


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值