进程 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;
- }
来源: http://www.bubuko.com/infodetail-2685906.html