Linux多进程 – 创建子进程
Linux创建单个子进程
fork函数
#include <unistd.h>
pid_t fork(void)
函数功能:创建一个子进程
函数返回:一次函数调用,由一个进程变成两个进程。两个进程分别对fork做返回。
1.返回子进程的pid(大于0) 父进程
2.返回0 子进程
案例代码: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位置开始向下运行)
- 闹钟(定时器) (每一个进程都有一个独有的定时器)
- 未决信号集