翼度科技»论坛 云主机 LINUX 查看内容

Linux进程的创建与销毁

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Linux操作系统是一种多任务、多用户的操作系统,这意味着它可以同时运行多个进程,每个进程都可以执行不同的任务。
在本文中,我们将介绍如何在Linux系统中创建和销毁进程。
进程的创建

在Linux系统中,进程的创建可以通过fork()系统调用来实现。
fork()函数将当前进程复制一份,创建一个新的进程。
新进程的代码、数据和堆栈等信息都是从原进程复制而来的。fork()函数返回两个值,对于父进程,它返回子进程的进程ID(PID),对于子进程,它返回0。
下面是一个使用fork()函数创建子进程的C语言程序:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. int main()
  5. {
  6.     pid_t pid;
  7.     pid = fork();
  8.     if (pid == -1) {
  9.         printf("Failed to fork.\n");
  10.         return 1;
  11.     }
  12.     if (pid == 0) {
  13.         printf("I am the child process %d. parent PID is %d.\n", getpid(),getppid());
  14.         // 这里是子进程的代码
  15.     } else {
  16.         printf("I am the parent process %d, child PID is %d.\n",getpid(),pid);
  17.         // 这里是父进程的代码
  18.     }
  19.     return 0;
  20. }
复制代码
运行编译好的程序,打印信息如下
  1. I am the parent process 3891, child PID is 3892.
  2. I am the child process 3892. parent PID is 3891.
复制代码
在这个程序中,我们首先声明了一个pid_t类型的变量pid,它用于存储fork()函数的返回值。接着,我们调用fork()函数,并根据返回值判断当前是父进程还是子进程。如果返回值为-1,说明fork()函数调用失败,程序将直接退出。如果返回值为0,说明当前是子进程,程序将执行子进程的代码。否则,说明当前是父进程,程序将执行父进程的代码。
进程的销毁

在Linux系统中,进程的销毁可以通过exit()系统调用来实现。exit()函数将当前进程终止,并返回一个退出状态。如果进程没有调用exit()函数而直接退出,系统会自动调用exit()函数。
下面是一个使用exit()函数终止进程的C语言程序:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/wait.h>
  6. int main()
  7. {
  8.     pid_t pid;
  9.     // 创建子进程
  10.     pid = fork();
  11.     if (pid < 0) {
  12.         fprintf(stderr, "创建子进程失败\n");
  13.         exit(EXIT_FAILURE);
  14.     } else if (pid == 0) {
  15.         // 子进程代码
  16.         printf("子进程开始执行,PID is %d.\n",getpid());
  17.         sleep(10);
  18.         printf("子进程执行完毕\n");
  19.         exit(EXIT_SUCCESS);
  20.     } else {
  21.         // 父进程代码
  22.         printf("父进程开始执行\n");
  23.         sleep(5);
  24.         printf("父进程执行完毕\n");
  25.         // 等待子进程结束
  26.         int status;
  27.         waitpid(pid, &status, 0);
  28.         if (WIFEXITED(status)) {
  29.             printf("子进程正常结束,退出状态为%d\n", WEXITSTATUS(status));
  30.         } else if (WIFSIGNALED(status)) {
  31.             printf("子进程被信号中断,信号编号为%d\n", WTERMSIG(status));
  32.         } else {
  33.             printf("子进程其他未知状态\n");
  34.         }
  35.     }
  36.     return 0;
  37. }
复制代码
该程序首先使用fork()函数创建一个子进程,并在子进程中执行一些操作,然后父进程等待一段时间后结束,并使用waitpid()函数等待子进程结束。子进程在执行完毕后调用exit()函数退出。在父进程中,可以通过waitpid()函数获取子进程的退出状态。最后,程序结束并返回0。

  • 编译后运行程序,正常运行打印信息如下
  1. 父进程开始执行
  2. 子进程开始执行,PID is 4013.
  3. 父进程执行完毕
  4. 子进程执行完毕
  5. 子进程正常结束,退出状态为0
复制代码

  • 运行后,终端输入kill - 9  4015 强制结束子进程,打印如下
  1. 父进程开始执行
  2. 子进程开始执行,PID is 4015.
  3. 父进程执行完毕
  4. 子进程被信号中断,信号编号为9
复制代码
小结

在Linux系统中,进程的创建可以通过fork()系统调用来实现,进程的销毁可以通过exit()系统调用来实现。
以上,如果觉得对你有帮助,点个赞再走吧,这样@知微之见也有更新下去的动力!
也欢迎私信我,一起交流!

来源:https://www.cnblogs.com/Wayne123/p/17214512.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具