【Linux学习笔记】09-进程控制

目录

​​​​一、进程创建方式

二、为什么要写时拷贝?

三、进程终止

四、进程等待

为什么要等待?

进程等待方法

1、wait

2、waitpid

五、进程替换​​​​​​​


​​​​一、进程创建方式

  1. 命令行启动命令(程序、指令等)
  2. 通过程序自身fork创建子进程

PCB:task_struct    进程地址空间:mm_struct


二、为什么要写时拷贝?


三、进程终止

int main() 
{
    cout << "hello world" << end;

    return 0;
}

其中return 0叫做返回进程退出码,通过进程退出码系统可以知道进程退出了且可以判断进程运行是否正确。可以通过echo $?在命令行中查看上一次进程运行的退出码:

[xupeng@VM-4-13-centos lesson12]$ cat test.c
#include "stdio.h"


int main() {
    printf("hello world\n");
    return 11;
}
[xupeng@VM-4-13-centos lesson12]$ ./test 
hello world
[xupeng@VM-4-13-centos lesson12]$ echo $?
11
[xupeng@VM-4-13-centos lesson12]$ 

通过strerror函数查看系统退出码列表:

  1 #include "stdio.h"
  2 #include "string.h"
  4 
  5 int main()
  6 {
  7     int i = 0;
  8     while (i < 100) {
  9          printf("%d : %s\n", i, strerror(i));                                                                       
 10          i++;
 11     }
 12 
 13     return 0;
 19 }

四、进程等待

为什么要等待?

进程等待方法

1、wait

等待任意一个子进程,子进程退出时,wait就可以返回

NAME
       wait, waitpid, waitid - wait for process to change state

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);

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

       int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

进程等待demo:

  1 #include <sys/types.h>
  2 #include <sys/wait.h>
  3 #include "stdio.h"
  4 #include "unistd.h"
  5 #include "stdlib.h"
  6 
  7 int main() {
  8     pid_t id = fork();
  9     if (id < 0) {
 10         perror("fork");
 11         return 1;
 12     }
 13     if (id == 0) {
 14         int count = 5;
 15         while (count) {
 16             printf("child(pid is : %d, ppid is : %d) is running: %d\n", getpid(), getppid(), count--);
 17             sleep(1);
 18         }
 19         printf("child quit...\n");
 20         exit(0);
 21     } else {
 22         printf("father is waiting...\n");
 23         sleep(10);
 24         pid_t ret = wait(NULL);
 25         sleep(3);
 26         printf("father is wait done, ret : %d\n", ret);
 27     }
 28     return 0;
 29 } 

以上代码可以看到僵尸进程状态(Z状态),然后被父进程回收,僵尸进程消失

while :; do echo "######"; ps ajx | grep proc | grep -v grep; echo "######"; sleep 1; done

2、waitpid

NAME
       wait, waitpid, waitid - wait for process to change state

SYNOPSIS
       #include <sys/types.h>
       #include <sys/wait.h>

       pid_t wait(int *status);

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

       int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);

pid:pid=-1表示等待任何一个子进程与wait等同;pid>0表示等待进程id与PID相等的子进程 。

  1 #include <sys/types.h>
  2 #include <sys/wait.h>
  3 #include "stdio.h"
  4 #include "unistd.h"
  5 #include "stdlib.h"
  6 
  7 int main() {
  8 
  9     pid_t id = fork();
 10     if (id == 0) {
 11         int count = 5;
 12         while (count) {
 13             printf("child is runnig : %d, ppid : %d, pid : %d\n", count--, getppid(), getpid());                     
 14             sleep(1);
 15         }
 16         printf("child quit...\n");
 17         exit(123);
 18     }
 19 
 20     int status = 0;
 21     pid_t ret = waitpid(id, &status, 0);
 22     printf("father wait done, ret : %d, exit code : %d\n", ret, (status >> 8)&0xff);
 23     return 0;
}

五、进程替换

创建子进程的目的;
1、执行父进程的部分代码
2、执行其他程序的代码(进程的程序替换)

进程替换原理:

 

 前面是路径(要执行的程序在哪儿),后面是程序名(要执行的命令),再后面是可变参数列表(选项)也就是 -xxx -yyy,可变参数列表以NULL结尾:execl("/usr/bin/ls", "ls", "-l", "-a", NULL)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值