【Linux进程】查看进程&&fork创建进程

这篇具有很好参考价值的文章主要介绍了【Linux进程】查看进程&&fork创建进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

 1. 查看进程

 2. 通过系统调用创建进程-fork初识

总结


前言

         你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用fork创建新的进程。通过了解这些内容,你将更好地理解Linux系统中的进程管理。

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 1. 查看进程

          在理解进程状态之前,我们要先学会查看进程,进程的信息可以通过 /proc 系统文件夹查看 

 ls /proc

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 可以看到有很多以数字命名的文件夹,这些数字其实就是进程的PID:

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 进行实验的代码:

#include <stdio.h>
#include <unistd.h>
#include<sys/types.h>
 int main()
   {
         pid_t id = getpid();
         pid_t fid = getppid();
         while(1)
         {
             printf("Hello world! pid: %d ppid: %d\n",id,fid);                                                  
             sleep(1);
         }
  
         return 0;
  
  }

 指令:

 ls /proc/【PID】 -ld

 进一步查看进程详细信息:

ls /proc/【PID】 -l

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 里边的文件都是进程的属性,这里有两个显眼的属性cwd和exe

  •  exe:进程可执行程序在磁盘中对应的位置
  •  cwd(current working directory):进程的当前工作目录

进程在运行时,它的可执行程序会被加载到内存当中,在进程运行的情况下我们依然可以删除它的可执行程序。删除之后再次查看运行中进程属性就会发现exe属性被标红且高亮闪烁【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 在C语言中我们对文件进行操作:

fopen("file.txt" , " w");

这里也解释了,在没有这个文件时为什么会默认在程序的当前目录下创建。因为那是进程的工作目录;我们也可以通过修改进程工作目录的方式,改变创建文件的默认路径。

 我们可以调用chdir这个系统调用接口来改变进程的工作目录,以下时chdir的相关说明文档:

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 使用时直接指定新路径即可,成功返回0,失败返回-1.

 实验代码:

int main()
{
    printf("self pid: %d\n", getpid());
    chdir("/home/test");

    FILE *fp = fopen("test.txt", "w");
    if(fp == NULL) return 1;

    fclose(fp);

    printf("新建文件完成\n");
    sleep(50); //50秒后结束运行,预留充足实际去查询进程

}

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 在程序运行结束之前,查看进程的属性时发现,进程的工作目录被修改为了:/home/test

 程序运行结束之后发现test.txt文件出现在/home/test目录下。

 2. 通过系统调用创建进程-fork初识

 查看fork操作手册:

man fork

 退出时输入q即可

 man指令前边文章提到过,查看命令手册页的命令,在面对一个新的指令或者未知的指令我们都可以使用man查看,面对一些系统调用接口时也可以使用。

在查看时说明文档或许很长,我们如果是需要快速上手使用,可以主要看3部分:

  • synopsis (所属头文件、返回值类型)
  • description(接口基本功能)
  • return value (具体返回值)

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

fork基本信息:

  • 作用:创建一个子进程,
  • 返回类型:pid_t
  • 返回值:创建成功返回子进程的PID给父进程,返回0给子进程,失败返回-1给父进程

 我们可以实验一下:

实验代码:

#include <stdio.h>
#include <unistd.h>
#include<sys/types.h>

int main()
{
   printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());
 
   pid_t id = fork();
 
   printf("after fork: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);                                      
 
   sleep(2);
   return 0;
}

 运行结果:

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 fork之后,运行了两次,原进程和子进程,fork之后代码共享,子进程会继承父进程大部分属性,子进程从fork之后执行

 原进程的父进程12333是谁? 其实是bash命令行解释器。

指令查看:

 ps ajx | grep pid

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

  •  为什么父进程返回子进程PID,子进程返回0 ?

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

        父进程与子进程的关系是1:n的关系,子进程有有唯一的父进程,而父进程为了辨别每个子进程就需要通过进程唯一的标识PID。

  • fork函数为什么会返回两次?

        fork函数功能是创建一个新的进程(子进程),子进程会继承父进程大部分属性,父进程调用fork函数执行到return时,子进程已经被创建,此时子进程继承了父进程状态,也是执行到return位置,父进程return一次,子进程return一次,所以它会执行两次。

  • id一个变量怎么可能同时大于0和等于0?

 进程在设计之初就被要求相互独立,互不影响,下面是一个测试样例:

父进程和子进程一起执行,使用kill指令发送信号杀死父进程,子进程不受影响依然可以运行。

【Linux进程】查看进程&&fork创建进程,linux,运维,服务器

 测试使用的指令:

while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done

 杀死进程:

kill -9 PID

 主要在进程运行界面杀死进程不能用ctrl c(会同时终止两个进程)。

 使用的代码

#include <stdio.h>
#include <unistd.h>
#include<sys/types.h>

int main()
{
    printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());

    sleep(5);
    printf("开始创建进程\n");
    sleep(1);
    pid_t id = fork();
    if(id < 0) return 1;
    else if(id == 0)
    {
        // 子进程
        while(1){
            printf("after fork, 子进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
            sleep(1);
        }
    }
    else{
        // 父进程
        while(1){
            printf("after fork, 父进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
            sleep(1);
        }
    }

    sleep(2);
    return 0;
}

 操作系统在设计进程之初就必须要考虑到进程相互独立这一点。

前边我们提到fork之后代码和数据共享,如果某一个进程修改了数据会不会对另一个进程造成影响?

        不会,操作系统为了使进程互不影响,某个进程(父进程或子进程)在修改数据时,操作系统会进行写时拷贝,进程修改数据时OS会单独开一块空间将数据复制一份交给(修改的数据)进程,修改数据也就是对新拷贝的数据进行修改。Linux中可以用同一个变量名,表示不同的内存空间。


总结

         进程是Linux操作系统中一个非常重要的概念,对于系统的管理和性能至关重要。通过本文的介绍,希望你对于Linux进程有了更深入的了解。在实际应用中,进程管理涉及到更多的细节和技巧。以上便是本文全部内容,希望对你有所帮助,感谢阅读!文章来源地址https://www.toymoban.com/news/detail-816144.html

到了这里,关于【Linux进程】查看进程&&fork创建进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux:创建进程 -- fork,到底是什么?

     相信大家在初学进程时,对fork函数创建进程一定会有很多的困惑,比如: 1.fork做了什么事情??  2.为什么fork函数会有两个返回值? 3.为什么fork的两个返回值,会给父进程谅回子进程pid,给子进程返回0? 4.fork之后:父子进程谁先运行?? 5.如何理解同一个变量,会有不同的值?? 本

    2024年02月05日
    浏览(29)
  • 头歌(Linux之进程管理一):第2关:进程创建操作-fork

    任务描述 在上一关我们学习如何获取进程的 pid 信息,本关我们将介绍如何编程创建一个新的进程。 本关任务:学会使用 C 语言在 Linux 系统中使用 fork 系统调用创建一个新的进程。 相关知识 在 Linux 系统中创建进程有很多函数可以使用,其中包括了系统调用也包括库函数。

    2024年02月06日
    浏览(29)
  • Linux服务器中查看进程的四种方法

    1. 使用 ps aux 命令来查看,能以简单列表的形式显示出进程信息 ps aux 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序. ps 命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进

    2024年02月02日
    浏览(30)
  • [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2.3为什么要共享写时拷贝 1.2.4 什么时候发生写时拷贝 1.3 fork函数返回值详解 1.3.1引入fork返回值的作用 1.3.2 fork返回执行逻辑剖析

    2024年03月21日
    浏览(45)
  • 【linux】服务器CPU占用50%,top/htop/ps却看不到异常进程?使用unhide可以查看!

    htop发现前32个核全被占满了,但是却找不到对应进程号 sysdig -c topprocs_cpu 发现CPU占用3143.28%,因为是32核,平均每核就是接近100% sysdig -c topprocs_cpu ,可以发现病毒进程号 检查 /etc/sysctl.conf 如果该文件只有一行 fs.file-max = =2097152 则大概率被隐藏 文件 / 进程 类病毒感染,注释掉

    2024年02月03日
    浏览(41)
  • 【Linux从入门到放弃】进程概念、查看进程、创建进程

    🧑‍💻作者: @情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再

    2024年02月12日
    浏览(32)
  • 操作系统练习:在Linux上创建进程,及查看进程状态

    进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。 每个进程都有一个唯一的进程标识符(process identifier,pid)。在Linux中,init进程是所有其他进程的根进程。 在Linux中,可以

    2024年02月12日
    浏览(39)
  • 【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

    目录 进程的概念及应用 进程的定义 进程的ID fork函数(进程创建函数)         多进程(以及多线程)是现代计算机网络的精髓。在之前,我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面的铺垫,我们对Socket也有了一定了解

    2024年02月09日
    浏览(40)
  • Linux------进程的fork()详解

    目录 前言 一、fork()的使用 二、fork()的返回值 我们为什么要创建子进程? 父进程与子进程的分流 三、fork的一些难理解的问题 1.fork干了什么事情? 2.fork为什么会有两个返回值  3.fork的两个返回值,为什么会给父进程返回子进程pid,给子进程返回0? 4.fork之后,父子进程谁先

    2024年01月18日
    浏览(28)
  • Linux中的进程、fork、进程状态、环境变量

            进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包

    2024年02月10日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包