当前位置:   article > 正文

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

linux进程

一、什么是进程?

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

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

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

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

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

二、多进程调度原理

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

三、进程环境与属性

1、环境变量

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

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

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

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

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

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. extern char **environ; // 不用定义,声明就能用 二重指针
  5. int i = 0;
  6. while (NULL != environ[i])
  7. {
  8. printf("%s\n", environ[i]);
  9. i++;
  10. }
  11. return 0;
  12. }

此外,操作系统还给我们提供了相关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)--清除某个环境变量。

举例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(void)
  4. {
  5. char *env_path = "PATH";//想要寻找的环境变量
  6. char *env_value = NULL;//存储环境变量的值
  7. env_value = getenv(env_path);
  8. if(NULL==env_value)
  9. {
  10. printf("not founf!\r\n");
  11. }
  12. printf("env_value:%s\r\n",env_value);
  13. return 0;
  14. }

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
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main(void)
  5. {
  6. pid_t p1 = -1, p2 = -1;
  7. p1 = getpid();
  8. printf("pid = %d.\n", p1);
  9. p2 = getppid();
  10. printf("parent id = %d.\n", p2);
  11. return 0;
  12. }

REF:

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/635159
推荐阅读
相关标签
  

闽ICP备14008679号