【Linux】进程概念
发布人:shili8
发布时间:2025-01-10 21:21
阅读次数:0
**Linux 进程概念**
在 Linux 系统中,进程(Process)是计算机执行的最小单位。每个进程都是独立的,并且有自己的虚拟内存空间、程序计数器等资源。
###什么是进程?
进程是指正在运行的程序或应用程序,它占据系统的一个或多个 CPU 核心,执行特定的任务。在 Linux 系统中,每个进程都有一个唯一的进程 ID(PID),用于区分不同的进程。
### 进程状态Linux 中的进程可以处于以下几种状态:
* **运行态**:正在执行的进程。
* **睡眠态**:等待某些事件发生的进程,例如 I/O 操作或信号。
* **僵死态**:已完成任务但尚未销毁的进程。
### 进程控制Linux 提供了多种命令和 API 来管理进程。以下是几个常见的例子:
####1. `ps` 命令用于显示当前系统中所有进程或指定 PID 的进程信息。
bash# 显示所有进程ps -ef# 显示指定 PID 的进程ps -p1234
####2. `kill` 命令用于终止一个或多个进程。
bash# 终止指定 PID 的进程kill1234# 终止所有指定 PID 的进程kill12345678
####3. `killall` 命令用于终止所有匹配指定名称的进程。
bash# 终止所有匹配 "chrome" 名称的进程killall chrome
####4. `pkill` 命令用于终止所有匹配指定条件的进程。
bash# 终止所有匹配 "chrome" 名称且 PID 大于1000 的进程pkill -f chrome -p1000-
### 进程通信Linux 提供了多种机制来实现进程间的通信,例如:
####1. 管道(Pipe)
用于将数据从一个进程传递给另一个进程。
c#include <stdio.h> #include <stdlib.h> int main() { int pipefd[2]; if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid ==0) { // 子进程 close(pipefd[0]); // 关闭读端 char buffer[10]; read(pipefd[1], buffer,5); // 从管道中读取数据 printf("子进程收到数据:%s ", buffer); } else { // 父进程 close(pipefd[1]); // 关闭写端 char* str = "Hello,World!"; write(pipefd[0], str,13); // 将数据写入管道 } return0; }
####2. 消息队列(Message Queue)
用于实现进程间的异步通信。
c#include <stdio.h> #include <stdlib.h> #include <sys/msg.h> #define MAX_MSG_SIZE1024int main() { int msgid = msgget(IPC_PRIVATE, IPC_CREAT |0644); if (msgid == -1) { perror("msgget"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid ==0) { // 子进程 char buffer[MAX_MSG_SIZE]; msgrcv(msgid, &buffer, MAX_MSG_SIZE,0,0); // 从消息队列中读取数据 printf("子进程收到数据:%s ", buffer); } else { // 父进程 char* str = "Hello,World!"; struct msgbuf buf; buf.mtype =1; strcpy(buf.mtext, str); msgsnd(msgid, &buf, strlen(str),0); // 将数据写入消息队列 } return0; }
####3. 信号量(Semaphore)
用于实现进程间的同步。
c#include <stdio.h> #include <stdlib.h> #include <sys/sem.h> #define SEM_KEY1234int main() { int semid = semget(SEM_KEY,1, IPC_CREAT |0644); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } pid_t pid = fork(); if (pid ==0) { // 子进程 struct sembuf sb; sb.sem_num =0; sb.sem_op = -1; // 等待信号量 sb.sem_flg = SEM_UNDO; semop(semid, &sb,1); printf("子进程进入临界区 "); } else { // 父进程 struct sembuf sb; sb.sem_num =0; sb.sem_op =1; // 发送信号量 sb.sem_flg = SEM_UNDO; semop(semid, &sb,1); } return0; }
### 总结Linux 进程概念是计算机执行的最小单位,每个进程都是独立的,并且有自己的虚拟内存空间、程序计数器等资源。Linux 提供了多种命令和 API 来管理进程,例如 `ps` 命令、`kill` 命令、`killall` 命令、`pkill` 命令等。Linux 还提供了多种机制来实现进程间的通信,例如管道、消息队列、信号量等。
### 参考* [Linux 进程管理]( />* [Linux 信号量](