Liunx系统fork函数

一、作用:创建一个子进程
二、接口
#include <unistd.h>

pid_t fork(void);

  1.返回值:进程创建成功时,父进程fork结束后返回子进程的进程ID,子进程返回0;失败返回-1。
  2.pid_t:类型表示进程ID,但为了表示-1,它是有符号整型。
  3.在父进程执行fork后,fork函数才变为2个,子进程虽然有fork函数,但是不会再创建其子进程。
在这里插入图片描述

三、创建一个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
	printf("父子进程共同的代码\n");
	pid_t  pid = fork(); //fork创建进程
	if(pid == -1){
		perror("fork error:");
		exit(1);
	} else if(pid==0){ //子进程的fork返回0
		printf("I am child ,我的进程pid = %u,我的父进程ppid = %u\n", getpid(),getppid());
	} else {//父进程fork返回>0
		printf("I am  parent,我的进程 pid = %u,我的父进程ppid = %u\n", getpid(),getppid());
		sleep(2); //父进程休息一下
	}
	printf("父子进程共同代码\n");
	return 0;
}
四、一个父进程创建多个子进程
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
	int i;
	pid_t pid;
	for(i=0; i<4; ++i) //创建4个子进程
	{
		pid=fork(); //创建进程
		if(pid==-1){
			perror("fork error:");
			exit(1);
		} else if(pid==0) //子进程
			break; //子进程直接跳出循环
		else //返回值pid>0,父进程
			continue; //父进程i++继续创建子进程
	}
	if(i<4){ //子进程
		sleep(i); //控制进程的执行顺序
		printf("I am %d child,my id is pid=%u\n",i+1,getpid());
	}
	else{
		sleep(i);
		printf("I am parent\n");
	}
	return 0;
}	
/*
由于创建完子进程之后,父子进程的执行的先后顺序未知,谁先抢到cpu谁就先执行
*/

五、刚fork后,父子进程有哪些相同和不同

  1.相同点:.text、全局变量、.data、栈、堆、环境变量、信号处理方式、用户ID、进程工作目录等。
  2.不同点:进程ID、fork返回值、父进程ID、程序运行时间、定时器、未决信号集。
  3.父子进程共享的内容:① 文件描述符(打开文件的结构体),② mmap建立的映射区。
  4.数据操作规则:读时共享,写时复制。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值