liunx 进程基础知识,进程的创建

(一)进程基础知识

(1):首先理解什么是进程:

如果是学过操作系统应该可以很好理解的,我们首先要理解程序的定义:首先程序是指一个指令列。为了方便操作系统(下面称OS)管理,完成程序并发执行,引入了进程,进程实体的概念。

OS为每一个运行的程序配置一个数据结构称为程序控制块(PCB)用来描述进程的各种信息。进程实体概念请看下图:

知道了进程的基本概念之后,我们要了解进程的状态和转换:

进程主要有三个状态:就绪态,运行态,阻塞态;下面是对状态转换解释,注意事项

(2)理解了什么是进程之后来看,在Linux下进程的基础知识

 进程指正在运行的程序,如下图示,是资源分配的最小单位,可以通过“ps ”或“top”等命令查看正 在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此 进程的同一资源。

每个进程都有一个唯一的标识符,既进程 ID,简称 pid

进程间的通信的几种方法?

管道通信:有名管道,无名管道

信号通信:信号的发送,信号的接受,信号的处理

IPC 通信:共享内存,消息队列,信号灯

Socket 通信

(二)进程的创建

(1)进程创建函数:     

所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程),pid 号为 1 的 init 进程是系统启动后 运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。 创建新进程的那个进程称为父进程,新进程称为子进程,父进程和子进程拥有相同的代码段数据段, 有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只 有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。 子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。 如果父进程先结束,子进程会被 init 进程收养,称为孤儿进程。

fork函数是进程创建函数他有两个返回值,为什么说他有两个返回值呢?

1、fork执行的时候,会有两个返回值,一个是父进程的返回值,一个是子进程的返回值。

2、在父进程中fork的返回值是子进程的PID。

3、在子进程中fork的返回值是0。

4、fork失败,返回值为-1

(2)解释为何有两个返回值:

将代码编译生成可执行文件,运行此可执行文件,会在OS中创建一个进程:当前进程为父进程,如果在此进程中调用fork函数会生成一个子进程,此子进程会和父进程拥有相同的代码段数据段,因此也会执行一遍fork函数,父进程fork函数的返回值为子进程创建成功后的pid,此为第一个fork函数的返回值;  如果子进程创建成功后代码中也有fork函数,也会执行一遍,但是子进程已经没有子进程了,会返回一个0;

在使用fork()函数创建子进程后,父子进程的执行顺序和先后顺序并不确定(为什么?不确定因为,父进程和子进程会抢cpu进行运行)。但是,可以通过fork()函数的返回值来确定当前进程是父进程还是子进程。具体来说:

  • 如果fork()函数返回值大于0,则表示当前进程是父进程。
  • 如果fork()函数返回值等于0,则表示当前进程是子进程。
  • 如果fork()函数返回值小于0,则表示创建进程失败。

因此,可以通过判断fork()函数的返回值来确定当前进程的身份,并根据需要执行不同的代码逻辑。虽然父进程和子进程的执行顺序不确定,但它们的身份可以根据fork()函数的返回值确定。

实验代码:

#include <stdio.h>
#include <unistd.h>
int main(void)
{
	pid_t pid;
	pid = fork();
	if (pid < 0)

	{
	printf("fork is error \n");
	return -1;
	}
	//父进程
	if (pid > 0)
	{
	printf("This is parent,parent pid is %d\n", getpid());
	}
	//子进程
	if (pid == 0)
	{
	printf("This is child,child pid is %d,parent pid is %d\n", getpid(), getppid());
	}
	return 0;
}


  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值