一、什么是进程?
一般来讲,进程定义为正在运行的程序的实例,简单地说,进程就是一个正在运行的程序。
-
==程序== (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: