Linux系统下进程相关操作

目录

一.  什么是程序,什么是进程,有什么区别?

二. 如何查看系统中有哪些进程?

三.什么是进程标识符

四.什么叫父进程,什么叫子进程?

五.C程序的存储空间如何分配?

六.fork创建一个子进程的一般目的?

七.vfork函数也可以创建进程,与fork有什么区别?

八.进程如何退出?

 正常退出

异常退出

九.为啥有时候要等待子进程退出?

问:如何获取子进程的退出状态?

问:什么是孤儿进程?

十.exec函数族

十一.system函数

十二.popen函数

头文件

函数原型

十三.如何添加当前路径到环境变量当中


一.  什么是程序,什么是进程,有什么区别?

程序是静态的概念,进程是程序的一次运行活动,程序跑起来了,系统中就多了一个进程。

二. 如何查看系统中有哪些进程?

a.使用ps指令查看

  实际工作中,配合grep来查找程序中是否存在某个进程(起到筛选的作用)。

如ps -aux | grep init 是一个用于在 Linux 系统中查找包含关键字 "init" 的进程的命令。

  • ps 是一个用于显示当前活动进程息的命令。
  • -aux 是选项,它会显示所有用户的所有进程,包括系统级别的和用户级别的。
  • | 是管道符号,用于将前一个命令的输出作为后一个命令的输入。
  • grep init 是通过管道连接到 ps 命令的另一个命令。grep 是一个用于搜索指定模式的工具。在这种情况下,我们正在搜索包含字符串 "init" 的内容。

b.使用top指令,命令终端输入top

三.什么是进程标识符

类似于身份证,每个进程都要一个非负整数表示唯一ID,叫做Pid

getpid() 用于获取自己的进程ID

getppid() 用于获取其父亲的进程

四.什么叫父进程,什么叫子进程?

fork(); //创建子进程

返回值>0,是父进程。    

       返回值==0,是子进程。

在 fork() 调用之前的代码行只会在父进程中执行,而不会在子进程中执行。当调用 fork() 创建子进程时,子进程会继承父进程的代码和数据,并从 fork() 调用的下一条指令开始执行。

五.C程序的存储空间如何分配?

 * 数据段   旧版  子进程会拷贝一份

                 新版   如果数据段子进程不做修改,子进程会与父进程共享,叫做写实拷贝

 * 代码段 子进程会与父进程共享

六.fork创建一个子进程的一般目的?

(1)父进程希望复制自己,使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服条请求。当这种请求到达时,父进程调用fork,使子进程处理此请求。父进程则继续等待下一个服务请求到达。

(2)一个进程要执行一个不同的程序。这对shell是常见的情况。在这种情况下,子进程从fork返回后立即调用exec

七.vfork函数也可以创建进程,与fork有什么区别?

区别1:vfork直接使用父进程存储空间,不拷贝

区别2:vfork保证子进程先执行,当子进程调用exit退出后,父进程才执行

八.进程如何退出?

 正常退出

1.main函数调用return

2.标准C库,进程调用exit()

3.系统调用, 进程调用_exit()或_Exit()

异常退出

1.调用abort

2.当进程收到某些信号时,如Ctrl + C

3.最后一个线程对取消,请求做出响应

九.为啥有时候要等待子进程退出?

创建子进程的目的:干活    ,所以我们要等待子进程的退出,并收集子进程退出状态

                  干完                   没干完

           (正常退出)        (异常退出)

*子进程退出状态不被收集会变成僵尸进程

*父进程不仅等待子进程的退出,还会收集子进程退出状态

问:如何获取子进程的退出状态?

在父进程中,调用wait函数可以等待子进程退出,并获取子进程的退出状态。

wait函数的原型如下:

pid_t wait(int *status);

其中,status参数用于存储子进程的退出状态。wait函数会阻塞父进程,直到一个子进程退出为止。

使用宏WEXITSTATUS来解析status的值。WEXITSTATUS(status)会返回子进程的退出状态,该状态通常是在子进程调用exit或者_main函数返回时指定的返回值。

问:什么是孤儿进程?

父进程如果不等待子进程退出,在子进程之前就结束了自己的“生命”,此时子进程叫做“孤儿进程”。

Linux为了避免系统中存在多个孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程。

十.exec函数族

exec函数族是一组用于在当前进程中执行新程序的函数。这些函数会将当前进程替换为新程序,从而运行新程序的代码和数据。一旦执行成功不会返回。

int execl(const char *path, const char *arg0, ... , (char *) NULL)

第一个参数为可执行文件的路径,第二个参数为文件名称,后面参数为新程序的参数,并以NULL作为结束标记。

此处可以用whereis <文件名>      查询绝对路径

如:whereis ls 查询ls的绝对路径

调用execlp()函数,我们这里不需要绝对路径,更加的方便

        如: execl("/usr/bin/date","date",NULL)

                execlp("date","date",NULL)

 

十一.system函数

system函数是一个C标准库中的函数,它用于在程序中执行shell命令。system函数创建一个新的子进程,并在该子进程中调用操作execl()来执行指定的命令。

#include <stdlib.h>

int system(const char *command);

system函数与execl函数的区别 :  system函数最后还会返回到原来的父进程中  ,execl函数一旦执行成功不会返回。

十二.popen函数

        popen函数是一个C标准库中的函数。比起system函数的好处,在于可以获取运行的输出结果。popen函数用于创建一个管道:其内部调用fork创建一个子进程,并在该子进程中调用操作execl()来执行指定的命令。

头文件

        #include <stdio.h>

函数原型

       FILE *popen(const char *command, const char *type);  //如果type是'r',则文件指针连接到command的标准输出,如果是'w',文件指针连接到command的标准输入。       

      int pclose(FILE *stream); //stream:popen返回的文件指针,如果调用失败,返回 -1

        以下是popen函数使用实例,用于输出进程信息

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

int main(){
    char ret[1024] = {0};
    FILE *fp;
    //调用popen函数,先创建子进程,然后子进程调用execl函数执行ps命令,通过管道将
    //输出信息流入到fp中,然后调用read函数读取内容
    fp = popen("ps","r"); 
    int n_read = fread(ret,1,1024,fp);

    printf("read ret %d byte,ret = %s\n",n_read,ret);
    return 0;
}

运行结果:

mi@mi-virtual-machine:~/Desktop/Process$ gcc demo15.c -o demo15.out
mi@mi-virtual-machine:~/Desktop/Process$ ./demo15.out
read ret 156 byte,ret =     PID TTY          TIME CMD
  53320 pts/7    00:00:00 bash
  53588 pts/7    00:00:00 demo15.out
  53589 pts/7    00:00:00 sh
  53590 pts/7    00:00:00 ps

十三.如何添加当前路径到环境变量当中

     * 命令行中键入 echo $PATH,显示环境变量 PATH 的值。

      * pwd查询当前绝对路径

      * export PATH=$PATH:/home/mi/Desktop/Process          

$符号表示“取”,通过使用 export,你可以将一个值赋给一个环境变量

$PATH 表示当前的 PATH 值,而 :/home/mi/Desktop/Process 表示要追加到 PATH 的新路径。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@尘音

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

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

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

打赏作者

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

抵扣说明:

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

余额充值