1. 程式人生 > >進程終止,環境表和環境變量操作

進程終止,環境表和環境變量操作

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;
}

進程終止,環境表和環境變量操作