Linux下的进程(一)—— 简单理解和操作

进程可以简单理解为:OS中管理进程的数据结构+该进程的代码和数据

这种管理进程的数据结构统称为pcb,在Linux中具体指task_struct结构体

以下几部分用于简单理解和操作进程

查看进程

ps -axj/-aux(-a 查看所有用户的进程 -x 显示后台进程)以作业格式/用户格式显示进程信息,-axj侧重于进程的作业和会话信息,适合需要了解进程组和会话的场景;-axu提供了更详细的资源使用情况,适合监控系统性能和资源占用

top 任务管理器

ls /proc 查看进程pid列表,知道pid后可以使用 cd /proc/pid 查看某进程具体信息

结束进程

kill -9 <进程pid> 

系统调用接口

fork 创建子进程,该函数返回之前已经产生两个执行流,也就是已经创建出了子进程,因此在父进程和子进程中各有一个返回值,正常情况下,父进程中的返回值为子进程pid,子进程中的返回值为0

getpid/getppid 获取当前进程pid/ppid

代码实例

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main(){
	int x = 100;
	printf("fork前进程的pid为%d,ppid为%d\n", getpid(), getppid());
	pid_t ret = fork();
    //assert(ret != -1);
	if (ret == 0){
		while (1){
			printf("我是子进程,我的pid是%d,我的ppid是%d,ret = %d, &ret = %p\n", getpid(), getppid(), ret, &ret);
			sleep(1);
		}
	}
	else {
		while (1){
			printf("我是父进程,我的pid是%d,我的ppid是%d,ret = %d, &ret = %p\n", getpid(), getppid(), ret, &ret);
			sleep(1);
		}
	}
	return 0;
}

有以下结果

观察到,同一个地址,ret居然有两个不同的值,这便涉及到写时拷贝和进程地址空间的知识

此处简单说明:

1.进程地址空间:每个程序都有自己的一套虚拟地址,其中,被使用的虚拟地址会通过页表映射到真实的物理地址;

2.写时拷贝:创建子进程时,创建新进程数据结构(task_struct)实例并加入OS管理进程的链表,子进程和父进程共享同一份代码和数据(为了节省空间),当子进程或父进程中的一方想要修改数据时,创建这份数据的拷贝,然后修改对应进程虚拟地址和物理地址的映射关系,使得该映射关系最终指向这份拷贝的数据。

在本例中,&ret为虚拟地址,两个进程中使用同一个虚拟地址并不奇怪。ret的值不同是因为:这两个进程中,页表映射关系不同。即在父进程中,&ret的虚拟地址通过页表映射到值为23370的物理地址,在子进程中,&ret的虚拟地址映射到值为0的物理地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值