一、进程与信号的环境表

进程启动前启动例程:初始化环境表

结构体extern 指向环境变量extern char** environ  
  HOME  //家目录

  PATH //环境变量
  SHELL //启动shell
  USER  //启动用户

int main(int argc,char*argv[],*envp[])

    每个进程都有一个独立的环境表
    初始的环境表集成父进程

获取环境表信息

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

int main(int argc,char *argv[],char *envp[])
{
    int i=0;
    char *env;
    while((env=envp[i])!=NULL)
    {
        printf("%s\n",env);
        i++;
    }
    return 0;
}

编译执行

XDG_SESSION_ID=1
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=192.168.1.103 49792 22
OLDPWD=/mnt/share
SSH_TTY=/dev/pts/8
USER=pxg
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
MAIL=/var/mail/pxg
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/php/bin:/usr/include
QT_QPA_PLATFORMTHEME=appmenu-qt5
PWD=/mnt/share/my_c
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/pxg
LOGNAME=pxg
SSH_CONNECTION=192.168.1.103 49792 192.168.1.180 22
LESSOPEN=| /usr/bin/lesspipe %s
XDG_RUNTIME_DIR=/run/user/1000
LESSCLOSE=/usr/bin/lesspipe %s %s
_=./extern

环境变量操作函数

#include<stdlib.h>
char *getenv(const char*name);//获取环境变量

int putenv(char *str); //设置环境变量 putenv("CITY=SHANGHAI")

int setenv(const char* name,const char *value,int rewrite)

设置环境变量 setenv("CITY","SHANGHAI",1)

int unsetenv(const char*name);//删除环境变量

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

extern char **environ ;

void show_env()
{
    int i=0;
    char *env;

    while((env=environ[i])!=NULL)
    {
        printf("%s\n",env);
        i++;
    }
}

int main(int argc,char *argv[])
{
    show_env();
    printf("-----------------------------\n");
    putenv("CITY=SHANGHAI");
    show_env();
    printf("-------------------------------\n");
    setenv("AGE","1",1);
    show_env();
    printf("-------------------------------\n");
    unsetenv("CITY");
    show_env();
    return 0;
}
时间: 2024-10-08 22:34:16

一、进程与信号的环境表的相关文章

十九、Linux 进程与信号---环境表

19.1 环境表 19.1.1 介绍 这是启动例程的第二各作用,搜集环境表,然后传递给主函数. 环境表就是一个指针数组.      环境表 每个进程都有一个独立的环境表 初始的环境表继承自父进程 主函数可以带三个参数,第三个参数则是环境表,可以通过第三个参数获取环境参数,也可以通过外部全局变量来定义环境表,extern char **environ. 设置的环境变量只影响当前进程的,不为全局的 19.1.2 例子 (1)通过 main 函数获取 1 #include <stdio.h> 2 #

Linux环境编程之进程(一):main函数调用、进程终止以及命令行参数和环境表

(一)main函数调用 main函数作为程序运行时的入口函数,它是如何被调用的呢?首先必须清楚一点,main函数也是一个函数,它只有被调用才能够执行.其实,在执行可执行程序时,在调用main函数之前,内核会先调用一个特殊的启动例程,将此启动例程作为可执行程序的起始地址.启动例程是如何作为可执行程序的起始地址的?这是由链接编译器设置的,而链接编译器则是由C编译器(如gcc编译器)调用的.启动例程作为可执行程序的起始地址主要做哪些工作呢?启动例程从内核取得命令行参数和环境变量值,以此来为main函数

进程终止,环境表和环境变量操作

进程ID:每个linux进程都一定有一个唯一的数字标识符,称为进程ID(总是一个非负整数) 进程终止:正常终止: 1.从Main返回(return) 2.调用exit (标准库) 3.调用_exit或_Exit (内核提供) 4.最后一个线程从启动例程返回 5.最后一个线程调用pthread_exit异常终止: 调用abort(信号相关) 接收到一个信号并终止(信号相关) 最后一个线程对取消请求做相应exit与_exit() 区别 是否刷新缓存区flush I/Oatexit 函数 exit:先

第5章 进程环境(3)_环境表和环境变量

3. 环境表 (1)每个进程都有一个独立的环境表(字符指针数组) (2)初始的环境表继承自父进程 (3)两种访问方式: ①int main(int argc, char* argv[], char* envp[]);  //第3个参数 ②extern char** environ;   //全局变量 4. 环境变量操作函数 (1)getenv:获取环境变量值 头文件 #include<stdlib.h> 函数 char* getenv(const char* name); 返回值 指向与nam

进程环境详解(三)---环境表

启动代码除了会将命令行参数传递给 main 外,还会从内核中获取到一张环境表.该环境表是由全局变量 environ 来指向的.environ 的类型定义如下: extern char ** environ: /* 这个定义在 unistd.h 头文件中 */ ===================================================== 但是在实际测试当中,使用environ指针的时候却报错了,如下图所示 于是去 unistd.h 头文件中查看 environ 的原始

进程环境之环境表【转】

本文转载自:http://www.cnblogs.com/nufangrensheng/p/3507968.html 每个程序都会接收到一张环境表.与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的C字符串的地址.全局变量environ则包含了该指针数组的地址: extern char **environ; 要在程序中使用全局变量environ时,需要用该语句作变量声明.extern指示environ在其他文件中已定义,要在本文件中使用. 例如,如果该环境包含5个字符

linux程序设计——进程和信号总结(第十一章)

11.4.2    信号集 头文件signal.h定义了类型sigset_t和用来处理信号集的函数.sigaction和其他函数.sigaction和其他函数将用这些信号集来修改进程在接收到信号时的行为. #include <signal.h> int sigaddset(sigset_t *set, int signo); int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); int sigdelset(sigset_t

一、进程与信号的结构

认识进程 ps -ef |more UID PID PPID C STIME TTY TIME CMD root 1 0 0 19:06 ? 00:00:04 /sbin/init auto noprompt root 2 0 0 19:06 ? 00:00:00 [kthreadd] root 3 2 0 19:06 ? 00:00:00 [ksoftirqd/0] root 4 2 0 19:06 ? 00:00:00 [kworker/0:0] root 5 2 0 19:06 ? 00:

第9章 进程和信号(一)

本文目录: 9.1 进程的简单说明 9.11 进程和程序的区别 9.12 多任务和cpu时间片 9.13 父子进程及创建进程的方式 9.14 进程的状态 9.15 举例分析进程状态转换过程 9.16 进程结构和子shell 9.2 job任务 9.3 终端和进程的关系 9.4 信号 9.41 需知道的信号 9.42 SIGHUP 9.43 僵尸进程和SIGCHLD 9.44 手动发送信号(kill命令) 9.45 pkill和killall 9.5 fuser和lsof 9.1 进程简单说明 进