Linux操作系统是一种多任务、多用户的操作系统,这意味着它能够同时运行多个过程,每个过程都能够执行不同的工作。
在本文中,咱们将介绍如何在Linux零碎中创立和销毁过程。
过程的创立
在Linux零碎中,过程的创立能够通过fork()零碎调用来实现。
fork()函数将以后过程复制一份,创立一个新的过程。
新过程的代码、数据和堆栈等信息都是从原过程复制而来的。fork()函数返回两个值,对于父过程,它返回子过程的过程ID(PID),对于子过程,它返回0。
上面是一个应用fork()函数创立子过程的C语言程序:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main(){ pid_t pid; pid = fork(); if (pid == -1) { printf("Failed to fork.\n"); return 1; } if (pid == 0) { printf("I am the child process %d. parent PID is %d.\n", getpid(),getppid()); // 这里是子过程的代码 } else { printf("I am the parent process %d, child PID is %d.\n",getpid(),pid); // 这里是父过程的代码 } return 0;}
运行编译好的程序,打印信息如下
I am the parent process 3891, child PID is 3892.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语言程序:
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/types.h>#include <sys/wait.h>int main() { pid_t pid; // 创立子过程 pid = fork(); if (pid < 0) { fprintf(stderr, "创立子过程失败\n"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子过程代码 printf("子过程开始执行,PID is %d.\n",getpid()); sleep(10); printf("子过程执行结束\n"); exit(EXIT_SUCCESS); } else { // 父过程代码 printf("父过程开始执行\n"); sleep(5); printf("父过程执行结束\n"); // 期待子过程完结 int status; waitpid(pid, &status, 0); if (WIFEXITED(status)) { printf("子过程失常完结,退出状态为%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("子过程被信号中断,信号编号为%d\n", WTERMSIG(status)); } else { printf("子过程其余未知状态\n"); } } return 0;}
该程序首先应用fork()函数创立一个子过程,并在子过程中执行一些操作,而后父过程期待一段时间后完结,并应用waitpid()函数期待子过程完结。子过程在执行结束后调用exit()函数退出。在父过程中,能够通过waitpid()函数获取子过程的退出状态。最初,程序完结并返回0。
- 编译后运行程序,失常运行打印信息如下
父过程开始执行子过程开始执行,PID is 4013.父过程执行结束子过程执行结束子过程失常完结,退出状态为0
- 运行后,终端输出kill - 9 4015 强制完结子过程,打印如下
父过程开始执行子过程开始执行,PID is 4015.父过程执行结束子过程被信号中断,信号编号为9
小结
在Linux零碎中,过程的创立能够通过fork()零碎调用来实现,过程的销毁能够通过exit()零碎调用来实现。
以上,如果感觉对你有帮忙,点个赞再走吧,这样@知微之见也有更新上来的能源!
也欢送私信我,一起交换!