Linux下关于进程的简单理解(C语言)

环境:ubuntu18.04

一、什么是进程

进程是系统中正在运行的一个程序,程序一旦运行就是一个进程。
于程序猿而言,进程是我们熟知的运行一个程序。
于计算机而言,进程是一个程序的执行/启动。
Linux下一个进程在内存中由三部分数据组成,即代码段、堆栈段、数据段
代码段:存放程序代码。
堆栈段:存放程序的返回地址、参数、局部变量等。
数据段:存放程序的全局变量、常数、动态数据分配的数据空间等。

二、终端命令说明

ps:查看当前终端进程
ps -ef:查看系统全部进程
ps - ef |more 同样是查看系统全部进程,但结果可以分页查看

使用ps -ef命令行结果如下
在这里插入图片描述
UID:启动进程的OS用户
PID:进程编号
PPID:进程的父进程编号
C:CPU资源使用百分比
STIME:进程启动时间
TTY:进程所属的终端
TIME:使用掉的CPU时间
CMD:执行的指令

三、代码示例

#include<stdio.h>
//#include<sys/types.h> //是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型
#include<unistd.h>
int main()
{
    
    
	printf("本程序的进程编号是: %d\n",getpid());//getpid()  获取本程序的进程编号
	int pid = fork(); //用于产生一个新进程
	//sleep(1);
	printf("pid=%d\n",pid);
	
	if( pid != 0 )
	printf("父进程编号是:%d\n",getpid()); 
	else
	printf("子进程编号是:%d\n",getpid());
	sleep(1);
	printf("父进程/子进程运行完后都会来到这儿!\n");
	sleep(1);
}

四、运行结果

在这里插入图片描述

五、分析

刚接触此内容的同学可能有点不太理解产生这个结果的原因

Q1、为什么fork()函数会返回两个值?

Q2、为什么if和else会都被运行?

Solution

调用fork()函数之后,fork()函数返回值有两种,一种是子程序,fork()的返回值是0。另一种是父进程,fork()的返回值是子进程的编号。程序猿可以通过fork()的返回值来区分父进程和子进程,然后再执行不同的代码。调用这个fork()函数时发生了什么呢?fork()函数创建了一个新的进程,新进程(子进程)与原有的进程(父进程)一模一样。子进程和父进程使用相同的代码段;子进程拷贝了父进程的堆栈段和数据段。子进程一旦开始运行,它复制了父进程的一切数据,然后各自运行,相互之间没有影响。

猜你喜欢

转载自blog.csdn.net/weixin_47700137/article/details/119669607