Linux进程管理之如何创建和销毁进程

Linux进程管理之如何创建和销毁进程

 更新时间:2024年02月18日 10:00:09   作者:程序员喵哥  
这篇文章主要介绍了Linux进程管理之如何创建和销毁进程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

目录
  • 创建进程
    • 1. 使用fork()系统调用
    • 2. 使用exec()系列函数
    • 3. 使用系统调用clone()
  • 销毁进程
    • 进程组与会话
      • 杀死进程
        • 总结

          Linux是一个多任务操作系统,进程管理是其核心功能之一。

          本文将详细介绍如何在Linux中创建和销毁进程,包括示例代码和详细说明。

          创建进程

          在Linux中,可以使用多种方法创建新的进程。

          以下是几种常见的方法:

          1. 使用fork()系统调用

          fork()系统调用是创建新进程的最常见方式。

          它会创建一个与父进程几乎完全相同的子进程。

          #include <stdio.h>
          #include <unistd.h>
          
          int main() {
              pid_t child_pid;
          
              child_pid = fork();
          
              if (child_pid == 0) {
                  // 子进程代码
                  printf("This is the child process\n");
              } else if (child_pid > 0) {
                  // 父进程代码
                  printf("This is the parent process, child PID: %d\n", child_pid);
              } else {
                  // 创建进程失败
                  perror("fork");
                  return 1;
              }
          
              return 0;
          }
          

          2. 使用exec()系列函数

          exec()系列函数用于在当前进程中执行一个新的程序。

          它们通常与fork()一起使用,以替换子进程的内存映像。

          #include <stdio.h>
          #include <unistd.h>
          
          int main() {
              pid_t child_pid;
          
              child_pid = fork();
          
              if (child_pid == 0) {
                  // 子进程代码
                  printf("This is the child process\n");
          
                  // 在子进程中执行新程序
                  execl("/bin/ls", "ls", "-l", NULL);
              } else if (child_pid > 0) {
                  // 父进程代码
                  printf("This is the parent process, child PID: %d\n", child_pid);
              } else {
                  // 创建进程失败
                  perror("fork");
                  return 1;
              }
          
              return 0;
          }
          

          3. 使用系统调用clone()

          clone()系统调用与fork()类似,但它允许更精细的控制,例如共享文件描述符和内存空间。

          #define _GNU_SOURCE
          #include <stdio.h>
          #include <sched.h>
          #include <stdlib.h>
          #include <unistd.h>
          
          int child_function(void *arg) {
              printf("This is the child process\n");
              return 0;
          }
          
          int main() {
              char *stack;
              char *stack_top;
              pid_t child_pid;
          
              stack = (char *)malloc(8192);
              if (stack == NULL) {
                  perror("malloc");
                  return 1;
              }
          
              stack_top = stack + 8192;
          
              child_pid = clone(child_function, stack_top, CLONE_VM | CLONE_FS | CLONE_FILES, NULL);
          
              if (child_pid == -1) {
                  perror("clone");
                  return 1;
              }
          
              printf("This is the parent process, child PID: %d\n", child_pid);
          
              return 0;
          }
          

          销毁进程

          Linux中,有几种方法可以销毁进程,其中最常见的是使用exit()系统调用。

          以下是一个示例:

          #include <stdio.h>
          #include <stdlib.h>
          #include <unistd.h>
          
          int main() {
              pid_t child_pid;
          
              child_pid = fork();
          
              if (child_pid == 0) {
                  // 子进程代码
                  printf("This is the child process\n");
          
                  // 子进程退出
                  exit(0);
              } else if (child_pid > 0) {
                  // 父进程代码
                  printf("This is the parent process, child PID: %d\n", child_pid);
          
                  // 等待子进程退出
                  wait(NULL);
          
                  printf("Child process has exited\n");
              } else {
                  // 创建进程失败
                  perror("fork");
                  return 1;
              }
          
              return 0;
          }
          

          进程组与会话

          在Linux中,进程组和会话是进程管理的重要概念。进程组是一组相关联的进程的集合,而会话则是一组进程组的集合。

          进程组通常用于将多个相关的进程组织在一起,以便更好地进行控制和信号处理。

          以下是创建进程组和会话的示例:

          #include <stdio.h>
          #include <stdlib.h>
          #include <unistd.h>
          
          int main() {
              pid_t child_pid;
          
              child_pid = fork();
          
              if (child_pid == 0) {
                  // 子进程代码
                  printf("This is the child process (PID: %d)\n", getpid());
          
                  // 创建一个新会话并成为会话领袖
                  if (setsid() == -1) {
                      perror("setsid");
                      return 1;
                  }
          
                  // 创建一个新进程组
                  if (setpgid(0, 0) == -1) {
                      perror("setpgid");
                      return 1;
                  }
          
                  printf("Child process is in a new session and process group\n");
                  sleep(10); // 保持进程运行10秒
              } else if (child_pid > 0) {
                  // 父进程代码
                  printf("This is the parent process, child PID: %d\n", child_pid);
          
                  // 等待子进程退出
                  wait(NULL);
          
                  printf("Child process has exited\n");
              } else {
                  // 创建进程失败
                  perror("fork");
                  return 1;
              }
          
              return 0;
          }
          

          在上述示例中,子进程首先创建了一个新会话并成为会话领袖,然后创建了一个新进程组。

          这将导致子进程脱离父进程的控制终端和进程组,成为一个独立的会话。这对于守护进程等后台任务非常有用。

          杀死进程

          在Linux中,可以使用kill命令或kill()系统调用来杀死进程。

          以下是一个示例:

          #include <stdio.h>
          #include <stdlib.h>
          #include <unistd.h>
          #include <signal.h>
          
          void sig_handler(int signo) {
              if (signo == SIGTERM) {
                  printf("Received SIGTERM, exiting...\n");
                  exit(0);
              }
          }
          
          int main() {
              pid_t child_pid;
          
              child_pid = fork();
          
              if (child_pid == 0) {
                  // 子进程代码
                  printf("This is the child process (PID: %d)\n", getpid());
          
                  // 注册信号处理函数
                  signal(SIGTERM, sig_handler);
          
                  while (1) {
                      // 子进程持续运行
                      sleep(1);
                  }
              } else if (child_pid > 0) {
                  // 父进程代码
                  printf("This is the parent process, child PID: %d\n", child_pid);
          
                  // 等待一段时间后向子进程发送SIGTERM信号
                  sleep(5);
                  kill(child_pid, SIGTERM);
                  printf("Sent SIGTERM to child process\n");
          
                  // 等待子进程退出
                  wait(NULL);
          
                  printf("Child process has exited\n");
              } else {
                  // 创建进程失败
                  perror("fork");
                  return 1;
              }
          
              return 0;
          }
          

          在上述示例中,父进程通过kill()系统调用向子进程发送SIGTERM信号,以请求子进程优雅地退出。

          总结

          Linux进程管理是操作系统的核心功能之一,对于系统开发和管理人员来说是重要的知识点。

          本文详细介绍了如何创建和销毁进程,以及如何使用进程组和会话来组织进程。此外,还介绍了如何杀死进程。

          希望本文提供的示例代码和详细说明有助于大家更好地理解和应用Linux进程管理的概念和技巧。也希望大家多多支持脚本之家。

          您可能感兴趣的文章:

          • linux 系统进程管理工具systemd详解(systemctl命令、创建自己的systemd服务)
          • Linux创建进程达到65535的方法
          • Linux 创建子进程执行任务的实现方法
          • linux下如何创建守护进程的步骤


          • Linux
          • 进程
          • 创建
          • 销毁

          相关文章

          • Linux中的CPU实现上下文切换

            这篇文章主要介绍了Linux中的CPU实现上下文切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教 2024-02-02

          • Linux中Oracle服务启动和停止脚本与开机自启动

            这篇文章主要介绍了Linux中Oracle服务启动和停止脚本与开机自启动,有兴趣的同学可以一起来了解一下。 2016-12-12

          • Linux下实现不活动用户登录超时后自动登出

            这篇文章主要介绍了Linux下实现不活动用户登录超时后自动登出 ,本文给大家带来了四种方式,每种方式都通过实例代码文字给大家介绍的非常详细,需要的朋友可以参考下 2019-08-08

          • Linux 中如何切换相同程序的不同版本

            这篇文章主要介绍了 Linux 中如何切换相同程序的不同版本,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 2018-08-08

          • 详解Linux下Nginx+Tomcat整合的安装与配置

            本篇文章主要介绍了Linux下Nginx+Tomcat整合的安装与配置,具有一定的参考价值,有兴趣的可以了解一下。 2017-01-01

          • 谈一谈linux系统重要的子目录问题

            这篇文章主要介绍了Linux系统重要的子目录问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧 2018-09-09

          • 详解Linux文件系统:ext4及更高版本

            今天小编就为大家分享一篇关于Linux文件系统:ext4及更高版本的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 2018-09-09

          • Apache 网站速度更快

            Apache2.0在性能上的改善最吸引人.在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强部分配置的可扩充性能.相比于Apache 2009-07-07

          • Centos7下PHP安装gd库的实例讲解

            下面小编就为大家分享一篇Centos7下PHP安装gd库的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-03-03

          • linux 类型  版本 内存 磁盘 查询命令介绍

            这篇文章介绍了linux 类型 、版本、内存、磁盘 查询命令,希望本篇文章可以帮助到大家的学习,喜欢本篇文章可以收藏一下方便下次浏览 2021-11-11

          最新评论

          版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
          文章名称:《Linux进程管理之如何创建和销毁进程》
          文章链接:https://zhuji.vsping.com/196742.html
          本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。