1、 环境变量linux
int main(void); int main(int argc, char* argv[ ]); int main(int argc, char* argv[ ], char* env[ ] )
#include <stdio.h> int main(int argc,char* argv[], char* env[]) { int i=0; while(env[i]) { puts(env[i++]); } return 0; }
程序执行的时候就能够输出全部的环境变量。编程
#include <stdio.h> extern char** environ; int main(int argc,char* argv[]) { int i=0; while(environ[i]) { puts(environ[i++]); } return 0; }
三、获取指定的环境变量vim
GETENV(3) Linux Programmer’s Manual GETENV(3) NAME getenv - get an environment variable SYNOPSIS #include <stdlib.h> char *getenv(const char *name); //要获取的环境变量,比方说传递的是 "HOME" ,将返回HOME的值
UTENV(3) Linux Programmer’s Manual PUTENV(3) NAME putenv - change or add an environment variable //增长或者改变环境变量的值 SYNOPSIS #include <stdlib.h> int putenv(char *string); //设置的环境变量字符串, string的格式以下: HOME=/home/volcanol
setenv( ) 和 unsetenv()数组
SETENV(3) Linux Programmer’s Manual SETENV(3) NAME setenv - change or add an environment variable //改变或者增长环境变量 SYNOPSIS #include <stdlib.h> int setenv(const char *name, //要设置的环境变量名;若是不存在就会建立新的环境变量,无论 overwrite的值 const char *value, //要设置的环境变量的值 int overwrite); // 若是环境变量已经存在,当 overwrite非零则改写原值, overwrite=0 则不改变原值 int unsetenv(const char *name); //要删除的环境变量
DESCRIPTION The setenv() function adds the variable name to the environment with the value value, if name does not already exist. If name does exist in the environment, then its value is changed to value if overwrite is non-zero; if overwrite is zero, then the value of name is not changed. The unsetenv() function deletes the variable name from the environment.
注意: bash
CLEARENV(3) CLEARENV(3) NAME clearenv - clear the environment SYNOPSIS #include <stdlib.h> int clearenv(void); DESCRIPTION The clearenv() function clears the environment of all name-value pairs and sets the value of the external variable environ to NULL.
注意这个地方: 没有 linux program manual 的字样,表示这个函数须要慎重使用。ide
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { char* env; setenv("Test-env","this is a test env", 1); env=getenv("Test-env"); printf("the Test-env is: %s\n ",env); return 0; }
[root@localhost process]# gcc main.c [root@localhost process]# ./a.out the Test-env is: this is a test env
[root@localhost process]# ./a.out the Test-env is:this is a test env [root@localhost process]# env | grep "test" [root@localhost process]# env | grep "env" _=/bin/env [root@localhost process]#
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { char* env; /*setenv("Test-env","this is a test env", 1);*/ /*env=getenv("Test-env")*/ putenv("test-env=this is a test env"); env=getenv("test-env"); printf("the test-env is:%s\n",env); unsetenv("test-env"); env=getenv("test-env"); printf("after unsetenv"); printf("the test-env is:%s\n",env); return 0; }
[root@localhost process]# gcc main.c [root@localhost process]# ./a.out the test-env is:this is a test env after unsetenvthe test-env is:(null) //环境变量已经删除 [root@localhost process]#
#include <stdio.h> #include <stdlib.h> extern char** environ; int main(int argc,char* argv[]) { int i=0; char* env; /*setenv("Test-env","this is a test env", 1);*/ /*env=getenv("Test-env")*/ putenv("test-env=this is a test env"); env=getenv("test-env"); printf("the test-env is:%s\n",env); unsetenv("test-env"); env=getenv("test-env"); printf("after unsetenv"); printf("the test-env is:%s\n",env); while(environ[i]) { printf("%s",environ[i++]); } return 0; }
[root@localhost process]# gcc main.c [root@localhost process]# ./a.out | grep "test" the test-env is:this is a test env after unsetenvthe test-env is:(null) [root@localhost process]#
GETPID(2) Linux Programmer’s Manual GETPID(2) NAME getpid, getppid - get process identification SYNOPSIS #include <sys/types.h> #include <unistd.h> pid_t getpid(void); pid_t getppid(void); DESCRIPTION getpid() returns the process ID of the current process. (This is often used by routines that generate unique temporary filenames.) getppid() returns the process ID of the parent of the current process.
#include <stdio.h> #include <unistd.h> int main(void) { pid_t pid; pid_t ppid; printf("pid=%d, ppid=%d\n", getpid(),getppid()); return 0; }
[root@localhost fork]# ./a.out pid=19077, ppid=714 [root@localhost fork]# ps aux | grep "bash" root 714 0.0 0.3 5940 1668 pts/1 Ss 04:46 0:01 bash
能够发现父进程的 进程ID为 714,咱们经过 ps 命令查看,能够知道 bash 的PID 为 714 ,由于 ./a.out 是由函数
EXEC(3) Linux Programmer’s Manual EXEC(3) NAME execl, execlp, execle, execv, execvp - execute a file SYNOPSIS #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char *arg, ...); int execle(const char *path, const char *arg, ..., char * const envp[]); int execv(const char *path, char *const argv[]); //参数以数组的形式传递 int execvp(const char *file, char *const argv[]); //参数以数组的形式传递
exec函数族的函数,将指定的可执行程序加载到调用exec函数的进程空间执行。若是exec函数执行成功,测试
#include <stdio.h> #include <unistd.h> int main(int argc,char* argv[]) { pid_t pid; printf("in program %s, pid=%d\n",argv[0],getpid()); execl("test","from caller",NULL); //exec从默认路径搜索 test 可执行文件,我系统中默认路径没有 test 可知文件,执行会失败 perror("execl"); return 0; }
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { pid_t pid; printf("argv[1]=%s, pid=%d\n",argv[1],getpid()); return 0; }
执行结果以下:this
[root@localhost fork]# vim main.c [root@localhost fork]# vim test.c [root@localhost fork]# gcc main.c [root@localhost fork]# gcc -o test test.c [root@localhost fork]# ./a.out in program ./a.out, pid=19402 execl: Bad address //execl( ) 函数执行失败返回
#include <stdio.h> #include <unistd.h> int main(int argc,char* argv[]) { pid_t pid; printf("in program: %s, pid=%d\n",argv[0],getpid()); execl("./test","test","aa",NULL); //指定test可执行文件在当前目录下 perror("execl"); printf("if execl execute successfull this statement never reach"); return 0; }
#include <stdio.h> #include <stdlib.h> int main(int argc,char* argv[]) { pid_t pid; printf("in program: %s, pid=%d\n",argv[0],getpid()); return 0; }
[root@localhost fork]# gcc main.c [root@localhost fork]# gcc -o test test.c [root@localhost fork]# ./a.out in program: ./a.out, pid=19836 //执行a.out ,并加载启动 test 可知文件 in program: test, pid=19836 //test 可执行文件加启动成功 [root@localhost fork]#
FORK(2) Linux Programmer’s Manual FORK(2) NAME fork - create a child process SYNOPSIS #include <sys/types.h> #include <unistd.h> pid_t fork(void);
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main(int argc,char* argv[]) { pid_t pid; //建立新进程 pid=fork(); if( 0==pid ) // 若是pid==0 则表示在子进程的进程空间 { //下面的代码在子进程的进程空间执行 printf("Now you a in child process\n"); printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n",getppid()); exit(0); //在子进程中退出 } //下面的代码在父进程的空间执行 printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n",getppid()); return 0; }
[root@localhost fork]# vim fork.c [root@localhost fork]# gcc fork.c [root@localhost fork]# ./a.out //第一次执行 Now you a in child process //子进程空间 my pid= 22333 //父进程空间 my pid= 22334 //子进程空间 the process that create me is :22333 //子进程空间 the process that create me is :714 //父进程空间 [root@localhost fork]# ./a.out //第二次执行 Now you a in child process //子进程空间 my pid= 22337 //子进程空间 the process that create me is :22336 //子进程空间 my pid= 22336 //父进程空间 the process that create me is :714 //父进程空间 [root@localhost fork]#
WAIT(2) Linux Programmer’s Manual WAIT(2) NAME wait, waitpid - wait for process to change state //等待某一个进程的状态的改变 SYNOPSIS #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
All of these system calls are used to wait for state changes in a child of the calling process, and obtain information about the child whose state has changed. A state change is considered to be: the child terminated; the child was stopped by a signal; or the child was resumed by a signal. In the case of a terminated child, performing a wait allows the system to release the resources associated with the child; if a wait is not performed, then terminated the child remains in a "zombie" state (see NOTES below).
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> int main(int argc,char* argv[]) { pid_t pid; int status; //建立新进程 pid=fork(); if( 0==pid ) { printf("Now you a in child process "); printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n\n",getppid()); exit(0); } //等待子进程的状态改变, 只有子进程的状态改变了wait才能返回,不然就阻塞父进程 wait(&status); printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n",getppid()); return 0; }
[root@localhost fork]# gcc fork.c [root@localhost fork]# ./a.out //第一次执行 Now you a in child process my pid= 24896 the process that create me is :24895 my pid= 24895 the process that create me is :714 [root@localhost fork]# ./a.out //第二次执行 Now you a in child process my pid= 24898 the process that create me is :24897 my pid= 24897 the process that create me is :714 [root@localhost fork]#
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> int main(int argc,char* argv[]) { pid_t pid; int status; //建立新进程 pid=fork(); if( 0==pid ) { sleep(5); printf("Now you a in child process "); printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n",getppid()); exit(0); } //等待子进程的状态改变 //wait(&status); waitpid(pid,&status,WNOHANG);//函数当即返回,而且经过输出参数status获取子进程的状态 printf("my pid= %d\n",getpid()); printf("the process that create me is :%d\n",getppid()); return 0; }
[root@localhost fork]# gcc fork.c [root@localhost fork]# ./a.out my pid= 25808 //父进程中waitpid 已经返回 the process that create me is :714 //父进程输出信息后已经结束 [root@localhost fork]# Now you a in child process my pid= 25809 //子进程开始输出信息, the process that create me is :1 [root@localhost fork]#
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> int main(int argc,char* argv[]) { pid_t pid; int status; int fd; char buf[128]; int size; int i; int j; fd=open("./txt",O_RDWR | O_CREAT | O_TRUNC); if(-1 == fd) { perror("open txt"); exit(0); } //建立新进程 pid=fork(); if( 0==pid ) { for(i=0;i<10;i++) { j=0; size=sprintf(buf,"in child process pid=%d ppid=%d i=%d\n",getpid(), getppid(),i); while(buf[j]) { usleep(2); write(fd,&buf[j++],1); } } exit(0); } for(i=0;i<10;i++) { j=0; size=sprintf(buf,"in parent process pid=%d ppid=%d i=%d\n",getpid(), getppid(),i); while(buf[j]) { write(fd,&buf[j++],1); usleep(2); } } //waitpid(pid,&status,WNOHANG);//函数当即返回,而且经过输出参数status获取子进程的状态 close(fd); return 0; }
in ipnar ecnth i plrocde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==207 8i4n3 pia=r0e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==217 8i4n3 pia=r1e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==227 8i4n3 pia=r2e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==237 8i4n3 pia=r3e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==247 8i4n3 pia=r4e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==257 8i4n3 pia=r5e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==267 8i4n3 pia=r6e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==277 8i4n3 pia=r7e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==287 8i4n3 pia=r8e nitn cphriolcde spsr opcieds=s2 7p8i4d3= 2 7p8p4i4d = 7p1p4i di==297 843 i=9
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> int main(int argc,char* argv[]) { pid_t pid; int status; int fd; char buf[128]; int size; int i; int j; fd=open("./txt",O_RDWR | O_CREAT | O_TRUNC); if(-1 == fd) { perror("open txt"); exit(0); } //建立新进程 pid=fork(); if( 0==pid ) { for(i=0;i<10;i++) { j=0; size=sprintf(buf,"in child process pid=%d ppid=%d i=%d\n",getpid(), getppid(),i); while(buf[j]) { usleep(2); write(fd,&buf[j++],1); } } exit(0); } wait(&status); //等待子进程状态改变,新增长的代码 for(i=0;i<10;i++) { j=0; size=sprintf(buf,"in parent process pid=%d ppid=%d i=%d\n",getpid(), getppid(),i); while(buf[j]) { write(fd,&buf[j++],1); usleep(2); } } //waitpid(pid,&status,WNOHANG);//函数当即返回,而且经过输出参数status获取子进程的状态 close(fd); return 0; }
in child process pid=27878 ppid=27877 i=0 in child process pid=27878 ppid=27877 i=1 in child process pid=27878 ppid=27877 i=2 in child process pid=27878 ppid=27877 i=3 in child process pid=27878 ppid=27877 i=4 in child process pid=27878 ppid=27877 i=5 in child process pid=27878 ppid=27877 i=6 in child process pid=27878 ppid=27877 i=7 in child process pid=27878 ppid=27877 i=8 in child process pid=27878 ppid=27877 i=9 in parent process pid=27877 ppid=714 i=0 in parent process pid=27877 ppid=714 i=1 in parent process pid=27877 ppid=714 i=2 in parent process pid=27877 ppid=714 i=3 in parent process pid=27877 ppid=714 i=4 in parent process pid=27877 ppid=714 i=5 in parent process pid=27877 ppid=714 i=6 in parent process pid=27877 ppid=714 i=7 in parent process pid=27877 ppid=714 i=8 in parent process pid=27877 ppid=714 i=9
【linux草鞋应用编程系列】_2_环境变量和进程控制spa
本系列文章未完,待续。
若是您发现,文章有疏漏之处请不吝指教,包括错别字,标点符号等任何错误。