进程 fork exec,wait/waitpid

来源:互联网 发布:软件测试教学视频 编辑:程序博客网 时间:2024/05/29 08:52

1,函数原型为:pid_t fork();调用一次返回两次,返回调用进程的pid号。

     pid_t pid;

     pid=fork();

     如果pid>0,则是子进程的进程号,说明此时调用进程是父进程;如果返回是0,则说明此时调用进程是子进程,若<0,则说明fork()出错。

    

      因为读时共享和写时复制,子进程会复制父进程的代码,但是从fork下开始执行。但是,当在fork前定义父子进程都用到的变量的时候,这时候父子进程并不是同时操作这个变量,而是相互独立的,也就是说:子进程指定自己的n,不会在父进程的n的基础上操作。

    

       pid_t getpid(void);返回调用进程的pid号

        pid_t getppid(void);返回调用进程的父进程的pid号

     依赖的头文件#include <unistd.h>        #include<sys/types.h>

         uid_t getuid(void);   返回实际用户ID

         uid_t geteuid(void);  返回有效用户ID

        gid_t getpid(void);返回实际用户组ID

        gid_t getepid(void);返回有效用户组ID


2,exec

      加载新的程序来替换当前进程的代码段和数据段。

     

      int execl(constchar *path, const char *arg, ...);

      int execlp(constchar *file, const char *arg, ...); 

      int execle(constchar *path, const char *arg,  ..., char * const envp[]);

      int execv(constchar *path, char *const argv[]);

      int execvp(constchar *file, char *const argv[]);

      int execvpe(constchar *file, char *const argv[], char *const envp[]);

      

     l 命令行参数列表

     p 搜素file时使用path变量

     v 使用命令行参数数组

     e 使用环境变量数组,不使用进程原有的环境变量,设置新加载程序运行的环境变量

 3,wait/waitpid

      

       僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程

       孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号,进程init进程,称为init进程领养孤儿进程

       依赖的头文件 #include <sys/types.h>   #include <sys/wait.h>

        pid_t wait(int *status);

        pid_t waitpid(pid_t pid, int *status, int options);

        如果不需要知道具体出错原因,就传wait(NULL),


        pid:

           <-1      回收指定进程组内的任意进程

           -1         回收任意子进程

            0         回收和当前调用waitpid一个组的所有子进程

           >0        回收指定ID的子进程

         options:

            WNOHANG  非阻塞

        具体如果不会用,不知道如何传参就用man函数来看一下。

         

     


阅读全文
1 0
原创粉丝点击