Linux多进程 -- 创建子进程

时间:2021-04-13 17:34:29

Linux多进程 – 创建子进程

Linux创建单个子进程

fork函数

#include <unistd.h>
pid_t fork(void)

函数功能:创建一个子进程

函数返回:一次函数调用,由一个进程变成两个进程。两个进程分别对fork做返回。

1.返回子进程的pid(大于0) 父进程

2.返回0 子进程

Linux多进程 -- 创建子进程

案例代码: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建立的映射区