Linux之进程管理一

第1关:获取进程常见属性

任务描述

Linux 环境下,进程是一个十分重要的概念。每个进程都由一个唯一的标识符来表示,即进程ID,通常称为pid。本关将介绍如何获取进程的pid

本关任务:学会使用C语言在Linux系统中获取进程的pid以及父进程的pid

相关知识

Linux系统中存在一个特殊的进程,即空闲进程(idle process),当没有其他进程在运行时,内核所运行的进程就是空闲进程,它的pid0。在启动后,内核运行的第一个进程称为init进程,它的pid1。通常,Linux系统中init进程就是我们在资源管理器中看到的名为init的程序。系统中其它的进程都是由init来创建出来的。

创建新进程的那个进程被称为父进程,而新创建的进程被称为子进程。每个进程都是由其他进程创建的(除了init进程),因此每个子进程都有一个父进程。

Linux系统提供了两个系统调用函数来获取一个进程的pid和其父进程的pid,分别是getpidgetppid函数。在Linux系统中可以使用man命令来查询这些函数的使用方法。具体的查询命令为: man 2 函数名

获取进程自身pid

获取进程本身的进程ID的系统调用函数是getpid,具体的说明如下:

  • 需要的头文件如下:

     
      
    1. #include <sys/types.h>
    2. #include <unistd.h>
  • 函数格式如下: pid_t getpid(void);

  • 函数返回值说明: 返回当前进程的pid值。

案例演示1: 编写一个程序,打印自身的进程ID。详细代码如下所示:

 
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. pid_t pid = getpid();
  7. printf("当前进程的ID为:%d\n", pid);
  8. return 0;
  9. }

将以上代码保存为getpid.c文件,编译执行。可以看到每次运行都打印出不同的进程ID,这是因为Linux系统动态的给进程分配pid

获取父进程pid

获取父进程的进程ID的系统调用函数是getppid,具体的说明如下:

  • 需要的头文件如下:

     
      
    1. #include <sys/types.h>
    2. #include <unistd.h>
  • 函数格式如下: pid_t getppid(void);

  • 函数返回值说明: 返回当前进程的父进程的pid值。

案例演示1: 编写一个程序,打印父进程ID和自身进程ID。详细代码如下所示:

 
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. int main()
  5. {
  6. pid_t pid = getpid();
  7. printf("当前进程的ID为:%d\n", pid);
  8. pid_t ppid = getppid();
  9. printf("当前进程的父进程ID为:%d\n", ppid);
  10. return 0;
  11. }

将以上代码保存为getppid.c文件,编译执行。可以看到每次运行都打印出相同的父进程ID,这是因为我们在同一个终端中运行3次程序,所以被运行的程序父进程为终端进程,因为父进程一直都一样。

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全getProcInfo函数,用于获取当前进程ID和其父进程ID(提示:将结果存放在procIDInfo结构体中)。
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>

/**********************
 * pid: 当前进程ID
 * ppid: 父进程ID
***********************/
struct procIDInfo
{
	pid_t pid;
	pid_t ppid;
};

/************************
 * 返回值: 需要被打开的目录路径
*************************/
struct procIDInfo getProcInfo()
{
	struct procIDInfo ret;   //存放进程ID信息,并返回
	/********** BEGIN **********/
	ret.pid= getpid();
    ret.ppid=getppid();

	
	/********** END **********/

	return ret;
}

第2关:进程创建操作-fork

编程要求

本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全createProcess函数,使用fork函数创建进程,并在子进程中输出"Children"字符串,在父进程中输出"Parent"字符串。(注意:不要在createProcess函数中使用exit函数或者return来退出程序)。
  • #include <unistd.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    
    /************************
     * 提示: 不要在子进程或父进程中使用exit函数或者return来退出程序
    *************************/
    void createProcess()
    {
    	/********** BEGIN **********/
    	pid_t pid=fork();
     
        if(pid==-1)
        {
            printf("创建进程失败(%s)!\n", strerror(errno));
        }
    	else if(!pid)
        {
            printf("Children",getpid(),getppid());
        }
        else
        {
            printf("Parent",getpid(),getppid());
        }
    
    
    	
    	/********** END **********/
    }
    

    第3关:进程创建操作-vfork

  • 编程要求

    本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全createProcess函数,使用vfork函数创建进程,并在子进程中输出"Children"字符串(提示:需要换行),在父进程中输出"Parent"字符串(提示:需要换行)。
    #include <unistd.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <stdlib.h>
    
    /************************
     * 提示: 不要在子进程中使用return来退出程序
    *************************/
    void createProcess()
    {
    	/********** BEGIN **********/
    	pid_t pid=vfork();
        if(pid==-1)
        {
            printf("创建进程失败(%s)!\n", strerror(errno));
        }
    	else if(!pid)
        {
            sleep(2);
            printf("Children\n",getpid(),getppid());
        }
        else
        {
            printf("Parent\n",getpid(),getppid());
        }
    
    
    	/********** END **********/
    
    	exit(0);
    }
    

    第4关:进程终止

  • 编程要求

    本关的编程任务是补全右侧代码片段中BeginEnd中间的代码,具体要求如下:

  • 补全exitProcess函数,使用atexit函数注册一个函数,在注册函数中打印出当前进程的ID号。
  • #include <unistd.h>

    #include <sys/types.h>

    #include <stdlib.h>

    #include <stdio.h>

    /************************

     * 提示: 用户需要在exitProcess函数中使用atexit函数注册一个自定义函数,并在自定义函数中打印出当前进程ID号

    *************************/

    void out()

    {

        printf("%d\n",getpid());

    }

    void exitProcess()

    {

        /********** BEGIN **********/

        if(atexit(out)!=0)

        {

            printf("调用atexit函数错误\n");

        }

    }

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值