如何创建进程

进程的不同状态:

  1. 执行态(RUNNING):进程正在占有CPU。
  2. 就绪态(RUNNING): 进程处于等待队列中等待调度。
  3. 挂起态/睡眠态:
    浅睡眠(INTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,可响应信号。
    深睡眠(UNINTERRUPTABLE):此时进程在等待一个事件的发生或某种系统资源,无法响应信号。
  4. 停止态(STOPPED):此时进程被暂停。
  5. 僵尸态(ZOMBIE):此时进程不能被调度,但是PCB未被释放。
  6. 死亡态(DEAD):这是一个已终止的进程,且PCB将会被释放。

进程状态

1.进程的创建

  • pid_t fork(void); // 创建一个进程
  • pid_t getpid(void); // 获取当前进程号(ID)
  • pid_t getppid(void); // 获取父进程号(ID)

2.进程的回收

  • pid_t wait(int *wstatus); // 阻塞回收一个子进程

  • pid_t waitpid(pid_t pid, int *wstatus, int options); // 不阻塞回收一个子进程

     options参数:
     WCONINUED:报告任意一个从暂停态出来且从未报告过的子进程的状态
     WNOHANG:非阻塞等待
     WUNTRACED:报告任意一个当前处于暂停态且从未报告过的子进程的状态
    

3.进程的退出

  • void exit(int status); // 退出
  • void _exit(int status); // 退出
  • void _Exit(int status); // 退出
  • return // 只能返回调用处

如何创建进程_第1张图片

处理子进程退出状态值的宏

 - WIFEXITED(status);// 如果子进程正常退出,则该宏为真
 - WEXITSTATUS(status);//如果子进程正常退出,则该宏将获取子进程的退出值
 - WIFSIGNALED(status);//如果子进程被信号杀死,则 该宏为真
 - WTERMSIG(status);  // 如果子进程被信号杀死,则该宏获取导致它死亡的信号值
 - WCOREDUMP(status); // 如果子进程被信号杀死且生成核心转储文件,则该宏为真
 - WIFSTOPPED(status); // 如果子进程被信号暂停,且option中WUNTRACEDye'i
 - WSTOPSIG(status); // 如果WIFSTOPPED(status)为真,则该宏将获取导致子进程暂停的信号值
 - WIFCONTINUED(status); // 如果子进程被信号SIGCONT重新置为就绪态,则该宏为真

4.进程的执行

  • int system(const char *command); // 指定执行某个程序,会多出一个进程,与llinux操作终端一样

  • exec函数族(专门用于程序执行)
    int execl(const char *path, const char arg, …
    /
    (char *) NULL */);
    int execlp(const char *file, const char arg, …
    /
    (char *) NULL */);
    int execle(const char *path, const char arg, …
    /
    , (char *) NULL, char * const envp[] */);
    int execv(const char *path, char *const argv[]);
    int execvp(const char *file, char *const argv[]);
    int execvpe(const char *file, char *const argv[],char *const envp[]);

     前4位:exec
     第5位:(2选1)
     l	:list以列表形式,进程传参
     v	:vector以指针数组形式,进程传参
     第6位:(可以不写,可以全写)
     p	:path 可执行文件路径
     e	:environment传参时指定环境变量路径
    

    说明:执行该函数,不会产生新的进程,只会替换当前进程内的内容。一般专门创建一个子进程给exec用于执行某个程序。

5.进程信号的发送/接受

发送信号

  • int kill(pid_t pid, int sig); // 给指定进程号发送某个信号
  • int raise(int sig); // 自己给自己发送某个信号

接送信号

  • void(*signal(int sig, void (*func)(int)))(int); // 捕捉一个指定的信号,即预先为某信号的到来做准备

     func参数:
     SIG_IGN:忽略
     SIG_DFL:默认状态
     void (*p)(int): 注册响应函数
    

挂起进程

int pause(void); // 将本进程挂起,直到收到一个信号

你可能感兴趣的:(linux)