Linux多进程 -- 创建子进程

3 篇文章 0 订阅
2 篇文章 0 订阅

Linux多进程 – 创建子进程

Linux创建单个子进程

fork函数
#include <unistd.h>
pid_t fork(void)
函数功能:创建一个子进程
函数返回:一次函数调用,由一个进程变成两个进程。两个进程分别对fork做返回。
1.返回子进程的pid(大于0) 父进程
2.返回0 子进程

fork函数返回值图解

案例代码:demo1.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
        pid_t pid;

        printf("----------\n");

        pid = fork();              // 产生子进程
        if(-1 == pid)
        {
                perror("fork error");
                exit(1);
        }
        else if(0 == pid)         // 子进程
        {
                printf("I am child process, pid=%u, ppid=%u\n", getpid(), getppid());

        }
        else                     // pid>0 父进程
        {
                printf("I am parent process, pid=%u, ppid=%u\n", getpid(), getppid());
                sleep(1);       // 睡眠一秒让子进程先结束
        }

        return 0;
}

创建多个子进程

案例代码:demo2.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int i = 0;
    pid_t pid = 0;

    for(i = 0; i < 5; ++i)
    {
        pid = fork();
        if(-1 == pid)        // 创建子进程失败
        {
            perror("fork error");
            exit(1);
        }
        else if(0 == pid)    // 子进程 跳出循环
        {
            break;           
        }
    }   

    if(i < 5)
    {
        // 打印子进程信息
        sleep(i);
        printf("I am %dth child process, pid=%u, ppid=%u\n", i+1, getpid(), getppid());
    }
    else
    {
        sleep(i);
        printf("I am parent\n");
    }

    return 0;
}
父进程和子进程都是进程,公平竞争CPU执行资源。

进程共享

刚fork之后
父子进程之间的相同之处:
  • 全局变量
  • .data 、.text
  • 堆 、栈
  • 宿组目录 、工作目录
  • 环境变量
  • 用户ID
  • 信号处理方式

(以下均是重点知识)

父子进程之间的不同之处:重点
  • 进程ID (父子进程之间拥有独立的PCB进程控制块)
  • fork返回值 (fork成功,父进程返回值大于0,子进程返回值等于0)
  • 父进程ID
  • 进程运行时间 (子进程的运行时间是从fork位置开始向下运行)
  • 闹钟(定时器) (每一个进程都有一个独有的定时器)
  • 未决信号集
父子进程间遵循读时共享,写时复制的原则。
注意规避全局变量共享问题。父子进程间全局变量是相同的,但是遵循读时共享写时复制的原则,一旦全局变量发生了改变,那么就会拷贝一份,所以不能使用全局变量进行进程间通信。
父子进程共享:
1.文件描述符(打开文件的结构体)
2.mmap建立的映射区
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值