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
本系列文章未完,待續。
若是您發現,文章有疏漏之處請不吝指教,包括錯別字,標點符號等任何錯誤。