• Linux系统进程与进程间通信


          Linux是一个多用户、多任务的操作系统,支持多个进程同时运行。进程是Linux系统中的基本单元,它们负责执行各种任务,如网页浏览、文件下载、程序运行等。在Linux中,进程是由一个或多个线程组成的,线程是进程的基本执行单元。   

    一.进程基础

            进程指正在运行的程序,如下图示,是资源分配的最小单位,可以通过“ps ”或“ top ”等命令查看正 在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此 进程的同一资源。

     

    每个进程都有一个唯一的标识符,既进程 ID ,简称 pid 进程间的通信的几种方法?
            1. 管道通信:有名管道,无名管道
            2 .信号通信:信号的发送,信号的接受,信号的处理
            3 .IPC 通信:共享内存,消息队列,信号灯
            4 .Socket 通信
    进程的三种基本状态以及转换 :

     

     

    二.进程创建 

            所有的进程都是由其他进程创建(除了 pid 0 号的 idle 进程), pid 号为 1 init 进程是系统启动后 运行的第一个进程,是所有进程的父进程,init 进程会初始化一部分系统服务,创建其他进程。
            创建新进程的那个进程称为父进程,新进程称为子进程,父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。采用写时拷贝技术,即创建的新进程不会立即把父进程的资源空间复制过来,只有在修改时才会复制资源,另外父进程挂起的信号和文件锁不会被子进程继承。子进程结束后,它的父进程要回收它的资源,否则就会成为僵尸进程 。如果父进程先结束,子进程会被 init 进程收养,称为孤儿进程。

     

     (1)fork()函数

            用于创建一个与父进程完全相同的子进程。子进程是父进程的副本,拥有自己的地址空间、文件描述符和资源,但共享父进程的部分信息,如打开的文件描述符、环境变量等。fork()函数的原型是pid_t fork(void);,它返回两次,一次在父进程中返回子进程的PID,一次在子进程中返回0。

     (2)父进程中创建一个子进程

             1.代码

    1. #include
    2. #include
    3. int main(void)
    4. {
    5. pid_t pid;
    6. pid = fork();
    7. if (pid < 0){
    8. printf("fork is error \n");
    9. return -1;
    10. }
    11. //父进程
    12. if (pid > 0)
    13. {
    14. printf("This is parent,parent pid is %d\n", getpid());
    15. }
    16. //子进程
    17. if (pid == 0)
    18. {
    19. printf("This is child,child pid is %d,parent pid is %d\n", getpid(), getppid());
    20. }
    21. return 0;
    22. }

            2.结果打印

     

    三.exec()函数

            在当前进程中执行一个新的程序。它会替换当前进程的代码和数据段,但保留原有的堆和栈。exec()函数的原型是int exec(const char *path, char *const argv[]);,它用于执行一个新的程序。参数path指定要执行的程序路径,参数argv是一个指向字符指针数组的指针,用于传递给新程序的参数。

    (1)代码

    1. #include
    2. #include
    3. int main() {
    4. char *argv[] = {"ls", "-l", NULL};
    5. exec("ls", argv);
    6. return 0;
    7. }

      exec()函数执行了ls命令,并传递了一个参数-l

    四.ps kill 命令       

            ps 命令 ps 命令可以列出系统中当前运行的那些进程。
                            命令格式:ps [参数]
                            命令功能:用来显示当前进程的状态
                            常用参数: aux
            kill 命令 kill 命令用来杀死进程
                            举例:kill -9(SIGKILL) PID
            进程的状态
                            D: 无法中断的休眠状态 (通常 IO 的进程 )
                            R: 正在执行中
                            S: 静止状态
                            T: 暂停执行
                            Z: 不存在但暂时无法消除
                            W: 没有足够的记忆体分页可分配
                            <: 高优先序的行程
                            N: 低优先序的行程
                            L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱 A I/O)
                            如下所示,使用命令“ ps aux | grep a.out ”查找到 ./a.out 的进程号为 3179 ,然后输入“ kill -9 3179 ”结 束此进程,

            完成后再次输入查找命令“ps aux | grep a.out”,没有发现 3179 号进程。 

     

  • 相关阅读:
    尚医通-预约挂号
    【ASM】字节码操作 转换已有的类 优化 删除复杂的转换 删除加0操作
    无偏估计和最小方差无偏估计简介
    GBase 8c V3.0.0数据类型——文本检索操作符
    spring cache 的常规使用
    1700*C. Mixing Water(数学 | 二分)
    [LMKD] [Android] 进程OomAdj调整分析:Empty被Kill流程(4)
    一、nginx自定义路径和模块安装[源码目录结构、自定义configure配置路径和模块]
    P8 服务拆分-服务远程调用
    Go :针对高复杂度表达式的各种测试(附完整源码)
  • 原文地址:https://blog.csdn.net/weixin_66634995/article/details/134429300