linux高级编程之进程线程(西红柿种子.七)

本期主要分享的是进程中进程回收以及获得环境变量的相关接口,比如wait,waitpid,getenv,setenv等,能够使得我们更好的使用进程做我们想做的事情!

进程回收:
    1.僵尸态:
        进程代码执行结束,但空间没有被回收        
    2.僵尸进程产生的原因:
        子进程先结束,父进程没有回收子进程空间,子进程会成为僵尸进程    
    3.如何避免产生僵尸进程:
        1.子进程结束父进程回收子进程空间
        2.让父进程先结束,子进程会成为孤儿进程,孤儿进程父进程为系统指定的进程,
          该孤儿进程结束,会被系统进程回收空间        
    4.孤儿进程:
        父进程先结束,子进程会成为孤儿进程,会被系统指定的进程收养

    5.wait和waitpid 
        (1)wait
                   pid_t wait(int *wstatus);
                   功能:
                                回收子进程空间,避免子进程进入僵尸态
                   参数:
                                wstatus:存放子进程结束状态空间的首地址
                                参数传NULL时,只会回收进程空间;
                  返回值:
                               成功返回回收到的子进程的PID
                               失败返回-1 
                               并且无子进程时会直接返回,有子进程时会阻塞等待回收;
        
           WIFEXITED(wstatus)
           判断进程是否正常结束
           
           WEXITSTATUS(wstatus)
           获得进程正常结束的值
           
           WIFSIGNALED(wstatus)
           判断进程是否被信号杀死
           
           WTERMSIG(wstatus)
           获得杀死进程的信号
        
           wait函数具有阻塞功能
           (1)能够实现回收子进程空间
           (2)能够实现父子进程任务的同步
           
           同步:具有先后执行的逻辑顺序关系;
           异步:不具有先后的顺序关系; 
         
        (2)waitpid
                   pid_t waitpid(pid_t pid, int *wstatus, int options);
                   功能:
                                回收子进程空间 
                  参数:
                        pid: 
                                < -1:回收子进程进程组ID与传入pid绝对值相同的子进程空间
                                ==-1:回收任意一个子进程
                                ==0 :回收子进程进程组ID与调用函数的PID值相同的进程
                                > 0 :回收子进程PID与传入PID相同的子进程空间
                        wstatus:存放子进程结束状态空间的首地址
                        options:
                                    WEXITED:等待子进程结束
                                    WNOHANG:不阻塞
                                    0:阻塞回收
                  返回值:
                                成功返回回收到子进程的PID
                               失败返回-1 
                                如果WNOHANG被设置,没有回收到结束的子进程返回0
                 注意: 不仅会回收结束进程,也会接收改变状态的进程;  

            相同点:
                wait(&status);等价于waitpid(-1, &status, 0);
            
            不同点:
                1.waitpid可以实现非阻塞回收
                2.waitpid可以回收指定的子进程空间        
    6.exec函数族(fork + exec是操作系统经常使用的在一个进程中启动新的进程的方法,包括linux中的很多进程都在使用这个方法,比如在终端执行a.out
      (1)int execl(const char *path, const char *arg, ...);               
        (2)  int execlp(const char *file, const char *arg, ...);
        (第一个参数可以只传文件名字,不要路径,但必须环境变量中要有,什么时候用l和p取决于是不是系统相关的目录,lp一般用于系统相关的目录的可执行文件)
        (3)  int execle(const char *path, const char *arg, ...);
        (4)  int execv(const char *path, char *const argv[]);(传参时可以使用指针数组进行传递
        (5)  int execvp(const char *file, char *const argv[]);
        (6)  int execvpe(const char *file, char *const argv[],char *const envp[]);
        l:参数以列表形式传递
        v:参数以指针数组形式传递
        p:在系统环境变量PATH对应的目录中找该文件
        e:执行新代码时更新环境变量信息        
        execl:
                功能:
                            利用进程空间执行一段新代码
                参数:
                            path:执行代码的路径(绝对路径或者相对路径)
                            arg:传入参数(第二个参数一般为标识符,与第一个路径中要执行的文件名相同,最后一个参数为NULL,其实就相当于在终端运行代码时的传参顺序)
                返回值:
                            成功不会返回
                            失败返回-1 

    7.环境变量相关函数接口:
        (1)getenv
                          char *getenv(const char *name);
                          功能:
                                    通过环境变量名获得该环境变量的值
                          参数:
                                    name:环境变量名
                          返回值:
                                    成功返回环境变量的值
                                    失败返回NULL        
        (2)setenv
                          int setenv(const char *name, const char *value, int overwrite);
                          功能:
                                    设置环境变量的值
                          参数:
                                    name:环境变量名
                                    value:环境变量的值
                            overwrite:
                                        非0值      覆盖
                                        0值        不覆盖
                          返回值:
                                    成功返回0 
                                    失败返回-1 

    8.system
                      int system(const char *command);
                      功能:
                                执行一条command shell命令
                      参数:
                                command:命令字符串首地址
                      返回值:
                                成功返回0
                                失败返回-1 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值