linux进程(一)——什么是进程?

一、什么是进程?

一般来讲,进程定义为正在运行的程序的实例,简单地说,进程就是一个正在运行的程序。

  • ==程序== (program):通常为二进制,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

  • ==进程== (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。

进程不仅仅包含了正在运行的代码,还包括了运行代码所需要的各种资源。内核中使用进程控制块PCB(process control block)管理一个进程的数据结构,每个进程都有一个PCB。

进程是资源所有资源分配的基本单位,线程则是CPU调度的基本单位。

二、多进程调度原理

在一个cpu上,可以存在多个进程,但是同一个时间段内,只能有一个进程工作。操作系统使用一定的算法管理所有进程,使得看起开像是并发执行,称之为“伪并发”;多核CPU可以实现真正意义上的并发。

三、进程环境与属性

1、环境变量

(1)、命令行使用export查看本机支持的环境变量的名称和内容

(2)在程序中获取环境变量

每个进程都有一个环境表,存储当前进程的环境变量。每个环境变量由“name=value”这样的字符串组成。

进程环境表其实是一个字符串数组,用environ变量指向它。  每一个环境变量都是一个字符串,所有的环境变量构成字符串数组。环境表的内存布局:

我们可以将所有的环境表中的变量打印出来:

#include <stdio.h>

int main(void)
{
	extern char **environ;		// 不用定义,声明就能用  二重指针
	int i = 0;
	
	while (NULL != environ[i])
	{
		printf("%s\n", environ[i]);
		i++;
	}
	
	return 0;
}

此外,操作系统还给我们提供了相关API,来帮助我们获得与修改环境变量

char * getenv(const char *name)--该函数用来获取名字为name的环境变量值,不存在时返回NULL。

int putenv(const char * string)--该函数用来改变或增加环境变量的内容。参数string的格式为“name=value”,如果该环境变量已经存在则会覆盖。

int setenv(const char *name, const char * value,int overwrite)--该函数用来改变或增加环境变量的内容。根据参数overwrite看是否覆盖。

int unsetenv(const char *name)--清除某个环境变量。

举例:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char *env_path = "PATH";//想要寻找的环境变量
	char *env_value = NULL;//存储环境变量的值

	env_value = getenv(env_path);
	
	if(NULL==env_value)
	{
		printf("not founf!\r\n");
	}
	
	printf("env_value:%s\r\n",env_value);
	
	return 0;
}

2、进程自身属性

一个进程除了能获得操作系统提供的环境变量之外,还具备自身的属性,主要包括:

  • 进程号(PID:process ID),
  • 父进程号(PPID parent PID),
  • 进程组号(PGID:process group ID),操作系统允许对进程进行分组
  • 真实用户号(UID:user ID),用户的唯一识别号,用于标识一个用户
  • 真实组号(GID:group ID),用户组的唯一识别号,用于标识一个用户组
  • 有效用户号(EUID:effective user ID),以其他用户身份访问文件使用
  • 有效用户组号(EGID:effective group ID),以其他用户组身份访问文件使用

(1)、命令行使用PS查看进程号

ps -aux查看所有进程

(2)在程序中获取进程号

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

  • pid_t getpid(void);--获取当前进程ID
  • pid_t getppid(void);--获取当前进程的父进程ID
  • uid_t getuid(void);--获取当前进程实际用户ID
  • uid_t geteuid(void);---获取当前进程有效用户ID
  • gid_t getgid(vid);--获取当前进程使用用户组ID
  • gid_t getegid(void);--获取当前进程有效用户组ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
	pid_t p1 = -1, p2 = -1;
	
	p1 = getpid();
	printf("pid = %d.\n", p1);	
	p2 = getppid();
	printf("parent id = %d.\n", p2);	
	
	return 0;
}

REF:

分享一下 Linus 对线程和进程的解释 - Gvoidy

Linux进程_你是人间四月天的博客-CSDN博客

Linux进程环境表 - 能量星星 - 博客园

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值