【Linux】Linux下进程链接结构,命令行参数,环境变量

bash 是一种 shell。在 Linux 系统中,当我们在终端输入命令时,通常是在一个 shell 环境下进行的。如果这个 shell 是 bash,那么所有命令行执行的命令都是 bash 的子进程。

1.Linux下进程链接结构

进程链接补充知识:

  • 所有进程都要以链表方式链接
  • 进程可以在调度队列里,也可以在阻塞队列里等等

Linux中链式结构:双链表结构

C语言中双链表:

如果按照C语言设定的链表结构,然后把进程属性与链接字段放在一起,这样就会显得不优雅,过于臃肿,更重要的是可扩展性小。

所以Linux设计模式,只有链接字段,没有属性字段。

结构体中,存放两个指针,前驱指针,与后驱指针,用来表示双链表,然后进程PCB中管理一个该结构体成员,可以通过该结构体成员,使用了node结构体的双向链表进而来链接其他进程,管理起来。

Linux采用了内部数据结构,属性在数据结构外部的方法,从而对进程进行管理链接。

扫描二维码关注公众号,回复: 17643635 查看本文章

那么意义是什么呢?

如图:

说明了,一个进程,既可以在全局链表中,又可以在任何一个其他数据结构中,只需要加相关数据结构节点字段即可!!!

一个进程如果在运行队列就链接到queuenode中,在等待队列中就链接到waitnode中!!!进程什么状态要做什么就链接到相关字段即可!!!

原理是什么呢?如果要知道进程属性怎么办呢?知道next,prev只能找到下一个进程的link地址,该怎么找到其进程相关属性呢?

在C语言中学过:

如上图,在一个结构体中,如果只知道变量c的地址该如何找到该数据结构的起始地址呢?

我们只要知道c相对于起始地址的偏移量,就可以知道数据结构起始地址,通过c的地址减去偏移量,然后对其结果进行强转一下就可以知道,起始地址。

那么关键是怎么求偏移量呢?我们把其实地址当作0来看,对0进行强转,然后指向c变量,然后对其取地址就可以知道偏移量是多少,然后再计算即可,

在C语言中有一个宏offset就是用来求偏移量的,和上面原理一样,知道偏移量就可以求出数据结构起始地址。

所以,当我们知道进程中link地址时,只要能得出偏移量就可以算出struct task_struct的初始地址,然后就可以直接访问进程数据了。

2.命令行参数

在main函数中,存在两个参数,argc 与 argv[]。argc指的是参数个数,argv指的是参数清单

让我们对上述代码打印看看

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("argc: %d\n", argc);
    for (int i = 0; i < argc; i++)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return 0;
}

结果如下:

在命令行上只输入可执行程序,结果是参数个数为1,参数清单有个刚才输入的字符串。在多输入几次观看发现,argc的参数个数就是在命令行上输入以空格为分隔符的字符串个数,acgv[]中就是这些字符串。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    printf("argc: %d\n", argc);
    for (int i = 0; argv[i]; i++)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return 0;
}