Linux的进程管理

学习目标:

       Linux 用户登录时会获取一个 Shell,产生一个进程;在 Shell 中输入一条命令,Shell 就
会创建一个进程,该进程是 Shell 的子进程。进程由进程启动,所有进程都应该有父进程。
       Linux 系统中的进程结构类似树形结构,使用 pstree 命令可以查看当前系统中的进程树。
进程树的顶端是进程 init,它是系统启动后创建的第一个进程,负责启动 getty 进程,设置进
程运行级别和回收孤儿进程等工作,是所有进程的祖先。
       Linux 系统中对进程的控制主要包含:进程创建、进程任务转变、进程同步和退出进!
程。Linux 提供了一些与进程控制相关的接口,常用的接口为 fork(),exec 函数族、wait()、
exit()。

       下面是我第一节课学习的内容,创建单进程,创建多个进程。


学习内容:

   进程创建

       多道程序环境中需要创建进程的情况通常有 4 种:用户登录、作业调度、用户请求和应
用请求。当一个程序执行时,它可能需要申请一些资源,如打开某个文件、请求某项服务等。
根据之前讲解的知识,遇到这种情况,进程会进入睡眠态并放弃占用的 CPU。

        若要申请的资源与之后的操作并不冲突,为了保障当前进程的持续执行(走完当前的时间片),此时可以在内存中再创建一个进程,让新的进程代替原进程执行资源申请的工作。
 

例如:

1.单个进程创建

#include<unistd.h>//fork()函数的函数库

pid_t fork(void)

说明:一般情况下,C风格的函数只能有一个返回值,但 fork()函数非常特殊,“它”能返回两个值。当然,并不是因为 fork()函数的构造特殊,而是因为 fork()函数调用后,若子进程创建成功,那么原程序会被复制,也就有了两个 fork()函数。

         子进程创建成功后,父进程中的fork()函数会返回子进程的 pid,子进程中的 fork()函数返回 0;若子进程创建失败,原程序不会被复制,父进程的 fork()函数返回-1。下面通过一个案例来展示 fork()函数的使用方法。


       案例 6-1:使用 fork()函数创建一个进程,进程创建成功后使父进程与子进程分别执行
不同的功能。

//2022.5.6  郭裕平
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    pid_t pid;

    pid = fork();

    if(pid == -1){  //创建失败
        
        perror("fork error");
        exit(1);
    }

    else if(pid > 0){//父进程
            
        printf("parent process,pid=%d,ppid=%d\n",getpid(),getppid());
    }

    else if(pid == 0){//子进程
            
        printf("child process,pid=%d,ppid=%d\n",getpid(),getppid());
    }//of if

    printf(">>>>>>>>>>>finish<<<<<<<<<<<<<<\n\n");
    
    return 0;

}

2.多个进程的创建

      计算机能实现的功能是很复杂的,可能在一个进程执行的过程中需要创建多个线程,这很容易便会想到使用循环:将 fork()函数放在循环结构中循环 5 次,就能创建 5 个进程。

       循环创建:

int i;
for(i = 0; i < 2; i ++){
	tempPid = fork();
}//of for i

       案例代码:

//2022.5.6  郭裕平
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){

	pid_t tempPid;
	int i;

	for(i = 0; i < 2; i ++){//循环创建多个进程
		if((tempPid = fork()) == 0){
			break;
		}//of if
	}//of for i

	if(tempPid == -1){
		perror("fork error");
	}

    else if(tempPid > 0){//父进程
		printf("parent process, pid = %d, ppid = %d\n", getpid(), getppid());
	}

    else{//子进程
		printf("I am child process = %d, pid = %d, ppid = %d\n", i + 1, getpid(), getppid());
	}//of if

	printf("......finish......");
	return 0;

}//of main


学习时间:

2022年5月7日


心得体会:

       进程创建是 Linux 编程学习中重要的一项,理解进程创建的过程才能避免在以后的学
习工作中创建进程时可能发生的一些错误。我们应理解进程的创建过程,并熟练运用
fork()函数,根据程序需求创建进程,然后不断练习,熟能生巧。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚小萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值