進程終止,環境表和環境變量操作
阿新 • • 發佈:2018-07-15
new 刷新 %s extern c abort strcat mic value cat
進程ID:
每個linux進程都一定有一個唯一的數字標識符,稱為進程ID(總是一個非負整數)
進程終止:
正常終止:
1.從Main返回(return)
2.調用exit (標準庫)
3.調用_exit或_Exit (內核提供)
4.最後一個線程從啟動例程返回
5.最後一個線程調用pthread_exit
異常終止:
調用abort(信號相關)
接收到一個信號並終止(信號相關)
最後一個線程對取消請求做相應
exit與_exit() 區別 是否刷新緩存區
flush I/O
atexit 函數
exit:先刷新緩存區,然後結束進程 ,在結束之前調用信號註冊函數atexit
_exit:不刷新緩存區 直接從進程退出,由內核直接結束進程 沒經過atexit
exit.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> int main(int argc,char *argv[]){ if(argc<3){ fprintf(stderr, "usage:%s file return|exit|_exit\n", argv[0]); exit(1); } FILE *fp=fopen(argv[1],"w"); //雙 引號 char *str = "hellophp"; fprintf(fp, "%s",str ); if(!strcmp(argv[2],"return")){ return 0; }else if(!strcmp(argv[2],"exit")){ exit(0); }else if(!strcmp(argv[2],"_exit")){ _exit(0); }else{ printf("process error\n"); } return 0; }
運行結果
[root@centos1 exit]# ./a.out exit.txt exit [root@centos1 exit]# ./a.out _exit.txt _exit [root@centos1 exit]# ./a.out return.txt return [root@centos1 exit]# more *.txt :::::::::::::: _exit.txt :::::::::::::: :::::::::::::: exit.txt :::::::::::::: hellophp :::::::::::::: return.txt :::::::::::::: hellophp
進程的環境表
獲取當前進程的環境表
1.通過別的地方定義的 引入過來
extern char **environ
2.通過main的第三個參數
進程中環境表操作
#include <stdio.h>
char *getenv(const char *name)
返回:指向與name關聯的value指針,若未找到則返回NULL
#include <std;ib.h>
int putenv(char *str);
int setenv(const char *name,const char *value,int rewrite); //1非0表示覆蓋
int unsetenv(const char *name);
返回:成功返回0,出錯返回非0
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> extern char **environ; void showenv(char **env){ int i=0; char *str; while ((str =env[i]) != NULL){ printf("%s\n",str ); i++; } } int main(int argc,char *argv[],char *envp[]){ printf("envrison=%p,envp=%p\n",environ,envp );//2個變量地址值一樣的 //showenv(environ); //printf("-------\n"); //showenv(envp); printf("----------------------------\n"); char *oldpath=getenv("PATH"); char *addpath=":/tmp/hkui"; int newlen=strlen(oldpath)+1+strlen(addpath)+1; printf("newlen=%d\n",newlen ); char newpath[newlen]; strcpy(newpath,oldpath); strcat(newpath,addpath); printf("oldpath:%s\n",oldpath); setenv("PATH",newpath,1); printf("newpath:%s\n",getenv("PATH")); putenv("NAME=HKUI2018"); printf("NAME:%s\n",getenv("NAME")); return 0; }
進程終止,環境表和環境變量操作