【每日一题】C语言系统进程与父进程的关系

前言

在本文中易语言取游戏进程id,我们介绍了 C 语言系统编程中进程的创建、执行和终止。我们的进程会有一个唯一的标识PID,它就像我们的身份证一样是一个唯一的数字。我们可以根据这个PID控制进程,结束、启动、挂起、运行等操作。接下来,我们来看看流程实现需要用到的几个基本功能。

分叉函数

正在运行的进程可以通过调用 fork 函数来创建新进程。fork 创建的进程称为子进程。我,fork 函数被调用一次,它会返回两次。子进程返回的值为0,而父进程返回的值是子进程的PID,为什么?因为一个进程可以有很多子进程,但是没有获取子进程PID的函数。为了方便子进程的管理,fork会返回父进程自己创建的子进程的PID。那么我们回想一下为什么我们的子进程返回0。原因是我们的子进程会有一个父进程,而父进程的PID可以通过函数getppid获取。对于每个进程,如果你想知道自己的pid,

子进程与父进程的关系

这里讲一个知识点,虚拟内存和物理内存的关系,我们32位系统进程生成0-4G(可用)虚拟内存空间,1-3G是我们的用户区,3-4G是我们的内核区,但是我们有些电脑没有那么大的内存,这个时候我们应该怎么办呢?我们的 CPU 中有一个 MMU 模块,可以帮助我们将 0-4G 的虚拟内存映射到我们的真实物理内存。下图是将0-4G的两个进程的虚拟内存映射到只有512M的物理内存。我们要注意的是内核段的虚拟内存是共享的,两个进程的内核区是用一个地址映射到物理内存的,但是我们用户区的虚拟内存是映射到物理内存独立。

通过看下图,我们可以更好地理解它。传入的两个内核段是共享的,所以你可能会问,我们不会互相影响吗?我们的过程由我们的过程控制模块 PCB 控制。每个进程都有自己的PCB控制模块,里面存储了自己进程的一些相关信息。我们的PCB其实是一个结构体,每个进程都有一个结构体,也可以通过MMU映射将这些结构体存储在同一个物理内存中,互不干扰,只有这样才能实现两个进程之间的通信。

执行顺序

一般来说,我们的流程执行没有顺序。换句话说,并不清楚谁先执行子进程和父进程。这取决于内核使用的跳过算法。如果我们需要按照自己的想法来实现进程顺序,那么我们可以使用sleep,例如:现在我们不知道是父进程还是子进程先执行,我们希望子进程先执行然后再执行执行父进程,然后我们的父进程添加一个 sleep(2) sleep 等待2秒,CPU在休眠时执行子进程易语言取游戏进程id,在休眠时间到时开始执行父进程。

实现代码

#include
 #include
 #include
 #include
int main ()
{
printf("进程前代码打印!!!!\n");
printf("进程前代码打印!!!!\n");
printf("进程前代码打印!!!!\n");
printf("进程前代码打印!!!!\n");
printf("进程前代码打印!!!!\n");
//开始创建进程
pid_t pid=fork();
if(pid==-1)
{
perror("fork error");
exit(-1);
}
else if(pid==0)
{
sleep(1);
printf("子进程创建成功!\n");
printf("父进程pid:%d\n",getppid());
printf("子进程pid:%d\n",getpid());
}
else if(pid>0)
{
printf("我是父进程!!!\n");
printf("我创建的子进程pid:%d\n",getpid());
}
printf("******进程后的代码*****\n");
sleep(2);
return 0;
}

结果

我们先看看添加睡眠前的打印情况。显然,流程执行的顺序是混乱的。然后加了sleep之后,再来看看结果。

显然,先执行父进程,再执行子进程。让我们看一下圈出的两个红色圆圈。我们来看代码,代码 printf(“******处理后的代码*****\n”); 只有一次,但为什么打印两次,子进程打印一次,父进程打印一次?

这里我们讲一个流程的知识点。父进程fork一个子进程后,创建的子进程实际上是父进程的副本。父进程中的代码也在子进程中,所以这就是为什么一个 print 语句执行了两次,所以有些读者可能会有疑问。那你说代码一模一样,那为什么子进程不打印下面的代码呢?

这是因为在父进程执行这些语句时,子进程尚未创建。程序自上而下执行,创建的子进程也宕机了,而不是返回从头执行。您可以将其理解为子进程。父进程分叉后的共享代码。

你现在对用 C 语言进行系统编程的过程有了一些了解吗?假设我的父进程声明了一个变量,按理说我们fork创建的子进程也会得到这个变量,那么如果我们在子进程中改变这个值,会不会影响到父进程的变量值过程?

如果你不知道,我建议你查一下我刚才说的内存映射部分,了解进程之间的关系。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论