linux unix 进程相关函数

       getgpid(int); //获取当前进程的进程组id
        setsid();  //自己成立一个进程组
        int atexit(void (*function)(void));   //登记程序正常结束时调用的函数(没有参数),如果有多份登记函数,按登记相反的顺序自动执行登记函数。
        int on_exit(void (*function)(int , void *), void *arg);  //登记程序正常结束时调用的函数(函数有参数),函数中int是main函数退出值,
        viod * 为arg,如果有多份登记函数,按登记相反的顺序自动执行登记函数。
        void exit(int status);  //结束当前进程,可在任何函数中结束当前进程,和在main函数中调用return一样
        void _exit(int status);   //立即结束当前进程,登记的结束函数不会执行,一般用户程序不用这个函数
            当进程结束时必须要做的事:关闭打开的文件描述符,释放动态内存,释放当前进程id
        int system(const char *command);  // fork一个子进程执行command 中的命令,命令结束后返回到当前进程
        getpid();
        getppid();
        getuid()
        gethostname()
        ps -l  //列出所有进程详细名单
        ps -f  //显示完整命令
        ps -p  //显示指定进程id
        ps -e  //显示所有进程(默认只显示本终端进程)
        初始化进程id =1,unix中有个id=0的调度进程
        
        多进程:多个任务同时工作
            int fork();  //把当前进程克隆一份,新的子进程只有进程id与父进程不同。两个进程都从克隆完成的地方继续运行,两份进程独立运行,谁先谁后没有规定。fork函数在执行return时已经克隆完成,将有两次return,fork在父进程中返回子进程id(一定不是0),子进程中返回0,返回-1表示函数执行失败。
           每个进程结束之后都应该由它的父进程去取得这个子进程结束的状态,之后才应该彻底回收这个子进程占用的系统资源。
           每个进程必须要有一个父进程,如果它的真正的父进程提前结束了,这个进程就成了孤儿进程,由init负责领养它。inti是系统中的孤儿院,它会领养系统中的所有孤儿进程。
            如果子进程先结束,就称为僵尸进程,等待父进程处理它之后彻底回收系统资源。     
            pid_t wait(int *wstatus);  //等待一个子进程结束,子进程的结束信息保存在wstatus中,返回子进程的进程id。
                     如果没有子进程返回-1,如果wstatus为空就丢弃结束信息,wait 结束后子进程的系统资源自动回收。
            pid_t waitpid(pid_t pid, int *wstatus, int options); //取得指定子进程的结束信息,保存在wstatus变量中,返回子进程的进程id,
                 如果第三个参数是0,就等待那个子进程结束为止,如果第三个参数是WNOHANG则不等待。
                 如果指定进程id为-1表示任意子进程。
                 如果第三个参数指定为WNOHANG,并且子进程没有结束,返回0.
                 子进程结束后,可以使用WIFEXITED(wstatus)来判断子进程是否正常结束,如果正常结束可以WEXITSTATUS(wstatus)来获取返回值。
                 WIFSIGNALED(wstatus)可以判断子进程是否是由信号中断,如果子进程是被信号中断,可以使用WTERMSIG(wstatus)来获取该信号。
            int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);    
           
            exec系列函数:在本进程中加载另一个程序并重头开始执行。一旦加载成功,原进程程序代码不再起任何作用,所以实际装载时不保留原来的代码
                而用新的程序代码覆盖原来旧的内存中的程序代码,数据也同样会被覆盖。因此,exec函数调用之后的代码只有在exec调用失败时才得以执行。
                进程id不会变化,但是进程内容变成新的程序的。一般都是fork一个子进程来调用exec加载的程序。
                vfork类似fork新建一个进程但是并不克隆父进程,需要立即调用exec函数加载新的程序。返回值与fork一样。
                extern char **environ;
                int execl(const char *path, const char *arg, ... /* (char  *) NULL */);
                int execlp(const char *file, const char *arg, .../* (char  *) NULL */);  //与execl一样但是可以通过PATH环境变量来查找执行文件。
                int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);  //与execlp一样,但是带有环境变量
                int execv(const char *path, char *const argv[]);
                int execvp(const char *file, char *const argv[]);  //与execv一样但是可以通过PATH环境变量来查找执行文件。
                int execvpe(const char *file, char *const argv[],  char *const envp[]);   //与execvp一样,但是带有环境变量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值