C语言经过

原文链接:http://www.orlion.ga/1015/

一、进程

    每个过程在基本中都发出一个经过控制块(PCB)来维护过程有关的消息,linux内核的进程控制块是task_struct结构体,其中有:

  • 进程id。系统遭到每个过程来一个唯一的id,在C语言中因故pid_t类型表示,是一个非负正是

  • 过程的状态,有运行、挂于、停止、僵尸等状态

  • 过程切换时索要保留与恢复的局部CPU寄存器

  • 叙述虚拟地址空间的信息

  • 讲述控制终端的音

  • 当前工作目录

  • umask掩码

  • 文件讲述符表,包含众多指向file结构体的指针

  • 以及信号有关的信息

  • 用户id和组

  • 操纵终端、Session和进程组。

  • 经过可以行使的资源上限

 

    fork的意向是因一个存世的历程(父进程)复制出一个初进程(子进程),系统被以运转在多个经过,这些过程都是自从首单纯发一个进程始起一个一个复制出来的,在Shell下输入指令可以运行一个序,是坐Shell进程在读取用户输入的一声令下下会调用fork复制出一个初的Shell进程,然后新Shell进程调用exec执行新的顺序。

    一个顺序可以频繁加载到内存中成为以运转的大半只经过,例如可以又起多个终端运行/bin/bash。一个历程在调用exec前后为可以独家施行两只例外的次序,例如当Shell下输入指令ls,首先fork创建子进程,这时子进程仍于执行/bin/bash程序然后子进程调用exec执行新的程序/bin/ls。如下图所示:

    C语言 1

    子进程的PCB是根据老子进程复制而来的,所以中的umask掩码也跟父进程一样。同样道理子进程的眼前干活目录也同父进程一样,所以我们因此cd改变Shell进程的做事目录,然后ls列有怪目录下之文书,ls进程实际是以列好之手上目录,而无是Shell进程的眼前目录,只不过ls进程的目录及Shell的目一样。但是子进程PCB中的经过id和父进程不同。

    

第二、环境变量

 

    exec系统调用执行新程序时见面将命执行参数和环境变量表传递给main函数,它们以全路过程地址空间被之职位如下所示:

    C语言 2

    和指令执行参数argv类似,环境变量表也是千篇一律组字符串,如下图所示:

    C语言 3

    libc定义的全局变量environ指向环境变量表,environ没有含在峰文件被,所以于用时如就此extern声明。例:

#include <stdio.h>

int main(void)
{
    extern char **environ;
    int i;
    for (i=0; environ[i] != NULL; i++)
        printf("%s\n", environ[i]);
    
    return 0;
}

    执行结果吧:

    C语言 4

    由于爸爸进程在调用fork创建子进程时会面把团结之环境变量表也复制给子进程,所以打印的环境变量和Shell进程打印的环境变量是均等之。环境变量定义了经过的周转条件。

    可以用char *getenv(const char
*name)获取name在环境变量表中对应之value。

    可以用int setenv(const char *name, const char *value, int
rewrite);设置环境变量。

    可以用void unsetenv(const char *name);删除name的定义。

    在子进程被修改环境变量并无会见改父进程的环境变量。