Linux进程基础知识

news2025/3/12 9:03:12

1. 什么是进程?

  • 进程就是运行中的程序,是系统资源分配的基本单位
  • 每个进程都有唯一的PID(进程ID)
  • 进程有父子关系,通过ps -ef可以查看

2. 进程的创建 - fork()

pid_t pid = fork();

- 简单理解:fork()就像细胞分裂,一个变两个

  • 调用一次,返回两次:父进程得到子进程PID,子进程得到0
  • 子进程是父进程的复制品

3. 进程的程序替换 - exec族

execl("/bin/ls", "ls", "-l", NULL);

- 保留进程ID,但内容完全变成新程序

  • 就像换灵魂:外壳不变,内在全变
  • 常用函数:execl, execlp, execle, execv, execvp等

4. 进程的等待与回收 - wait/waitpid

pid_t wait(int *status);

pid_t waitpid(pid_t pid, int *status, int options);

- 父进程等待子进程结束并回收资源

  • 避免僵尸进程(zombie)的产生
  • waitpid比wait更灵活,可以非阻塞等待

5. 进程的退出

exit(0);    // 标准C库函数

_exit(0);   // 系统调用

  • exit会刷新缓冲区,exit直接退出
  • 返回值0表示正常退出

一. 文件操作与I/O

1. 文件描述符

  • 就像文件的"身份证号码"
  • 标准输入(0)、标准输出(1)、标准错误(2)
  • 每个进程最多可打开的文件数有限制

2. 文件操作基本函数

// 打开文件

int fd = open("test.txt", O_RDWR | O_CREAT, 0644);

// 读取文件

char buf[1024];

int n = read(fd, buf, sizeof(buf));

// 写入文件

write(fd, "hello", 5);

// 关闭文件

close(fd);

// 文件指针定位

lseek(fd, 0, SEEK_SET);  // 回到文件开头

3. 文件属性获取

struct stat st;

stat("file.txt", &st);



- 获取文件大小:st.st_size
  • 判断文件类型:S_ISREG(st.st_mode)、S_ISDIR(st.st_mode)

4. 目录操作

DIR *dir = opendir(".");

struct dirent *entry;

while ((entry = readdir(dir)) != NULL) {

    printf("%s\n", entry->d_name);

}

closedir(dir);

三、进程间通信(IPC)

1. 管道通信

int fd[2];

pipe(fd);  // fd[0]读端,fd[1]写端
  • 单向通信:水管模型,一端进一端出
  • 只能用于有亲缘关系的进程
  • 适合简单的数据传输

2. 命名管道(FIFO)

// 创建命名管道

mkfifo("myfifo", 0644);

// 使用方法与普通文件类似

int fd = open("myfifo", O_WRONLY);

- 可用于无关进程间通信

  • 遵循先进先出原则

3. 信号通信

// 信号处理函数

void sig_handler(int signo) {

    printf("收到信号: %d\n", signo);

}

// 设置信号处理

signal(SIGINT, sig_handler);

- 常见信号:

  • SIGINT (2): Ctrl+C中断
  • SIGKILL (9): 强制终止(不可捕获)
  • SIGTERM (15): 终止信号
  • SIGCHLD (17): 子进程状态改变
  • SIGALRM (14): 定时器到期

四、实用示例

1. 创建守护进程

void daemonize() {

    pid_t pid = fork();

    if (pid < 0) exit(1);

    if (pid > 0) exit(0);  // 父进程退出

    

    setsid();  // 创建新会话

    

    // 关闭标准输入输出错误

    close(0);

    close(1);

    close(2);

    // ...更多操作

}

2. 简单shell实现

while (1) {

    printf("myshell> ");

    fgets(cmd, sizeof(cmd), stdin);

    

    if (fork() == 0) {

        // 子进程执行命令

        execlp(cmd, cmd, NULL);

        exit(0);

    } else {

        // 父进程等待

        wait(NULL);

    }

}

五、常见错误与调试技巧

1. 经典错误

  • 僵尸进程:子进程结束但未被回收
  • 孤儿进程:父进程先于子进程结束
  • 内存泄漏:申请的内存未释放
  • 文件描述符泄漏:打开文件未关闭

2. 调试工具

  • strace:跟踪系统调用
  • gdb:代码调试器
  • valgrind:内存错误检测
  • lsof:查看打开的文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

halcon deeplearn 语义分割经验分享 1

本人因为公司遗留问题,为了解决识别错误的问题。尝试过yolo12进行目标检测。初步测试良好但是是halcon的socket通信不行。故而去测试halcon 的deeplearn。自己标注数据。 注: 这个软件使用非常无脑。推荐没有基础的人去用 语义分割 以下是halcon的调用模型 *读取模型 read_dl_…

从零开始的python学习(五)P75+P76+P77+P78+P79+P80

本文章记录观看B站python教程学习笔记和实践感悟&#xff0c;视频链接&#xff1a;【花了2万多买的Python教程全套&#xff0c;现在分享给大家&#xff0c;入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…

Kylin麒麟操作系统服务部署 | ISCSI存储服务

以下所使用的环境为&#xff1a; 虚拟化软件&#xff1a;VMware Workstation 17 Pro 麒麟系统版本&#xff1a;Kylin-Server-V10-SP3-2403-Release-20240426-x86_64 一、网络存储结构 网络存储技术&#xff08;Network Storage Technologies&#xff09;是基于数据存储的一种通…

数据结构_单链表

今天我们要开启链表的学习 &#x1f58b;️&#x1f58b;️&#x1f58b;️ 学了顺序表我们可以知道&#xff1a; &#x1f388;链表其实就是争对顺序表的缺点来设计的&#xff0c;补足的就是顺序表的缺点 &#x1f388;链表在物理上是上一个节点存放的下一个节点的地址 链表 …

深陷帕金森困境,怎样重燃生活信心?

帕金森&#xff0c;这个悄然影响无数中老年人生活的神经系统疾病&#xff0c;正逐渐走进大众视野。患病后&#xff0c;患者常出现静止性震颤&#xff0c;安静时手部、下肢不自主抖动&#xff0c;如同在默默诉说着身体的异常。肢体变得僵硬&#xff0c;行动迟缓&#xff0c;起步…

C语言(23)

字符串函数 11.strstr函数 1.1函数介绍&#xff1a; 头文件&#xff1a;string.h char *strstr ( const char * str1,const char *str2); 作用&#xff1a;在一个字符串&#xff08;str1&#xff09;中寻找另外一个字符串&#xff08;str2&#xff09;是否出现过 如果找到…

Docker运行hello-world镜像失败或超时:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi

Docker运行hello-world镜像失败或超时&#xff0c;报错&#xff1a;Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …

Linux内核如何和设备树协同工作的?

1.编写设备树 cd arch/riscv/boot/dts/ 再cd到厂商&#xff0c;例如下述内容。 2.编译设备树&#xff08;dts->dtb&#xff09;通过dtc命令来转换 3.解析设备树 例如上述内容&#xff0c;都是对设备树的解析。 这里重点说一下内核对设备树的处理吧&#xff0c;因为这个内…

LLM中的transformer结构学习(二 完结 Multi-Head Attention、Encoder、Decoder)

文章目录 LLM中的transformer结构学习&#xff08;二 完结 Multi-Head Attention、Encoder、Decoder&#xff09;Self-Attention &#xff08;自注意力机制&#xff09;结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMas…

高效编程指南:PyCharm与DeepSeek的完美结合

DeepSeek接入Pycharm 前几天DeepSeek的充值窗口又悄悄的开放了&#xff0c;这也就意味着我们又可以丝滑的使用DeepSeek的API进行各种辅助性工作了。本文我们来聊聊如何在代码编辑器中使用DeepSeek自动生成代码。 注&#xff1a;本文适用于所有的JetBrains开发工具&#xff0c…

爱可以传递,幸福可以具象化

遇到什么&#xff1a;晚上上课学生吵吵吵&#xff0c;把学生手机全部收了&#xff0c;放讲台上。 感受到的情绪&#xff1a;很烦躁。 反思&#xff1a;收手机也不是长久之计&#xff0c;可是物理有什么翻转课堂呢&#xff1f; 明天的待办事项&#xff1a;早上高数选修课&#x…

力扣-数组-367 有效的完全平方数

思路和时间复杂度 思路&#xff1a;利用二分&#xff0c;确定区间是左闭右闭&#xff0c;然后根据大小进行二分时间复杂度&#xff1a; 代码 class Solution { public:bool isPerfectSquare(int num) {bool flag false;if(num 0 || num 1) return true;long long …

Java关键字与标识符

Java关键字是预定义的保留字&#xff0c;用于定义程序结构和语义&#xff0c;如if、for、class等&#xff0c;不能用作标识符。JDK 8有50个关键字&#xff0c;JDK 11引入var用于局部变量类型推断。标识符用于命名变量、类等&#xff0c;由字母、数字、_、$组成&#xff0c;不能…

【神经网络】python实现神经网络(二)——正向推理的模拟演练

一.神经网络假设 在开始讲解之前,首先我们假设有这样一套神经网络,一共有三层: 其中,关于神经网络的权重、偏置的符号定义如下(如果不知道什么是权重和偏置,可以参考我之前写过的一篇文章:【机器学习】机器学习是什么意思): 以下文章将沿用以上这个设…

DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了&#xff0c;虽然经过扩容和调整&#xff0c;但反应依旧不稳定&#xff0c;甚至小圆圈转半天最后却提示“服务器繁忙&#xff0c;请稍后再试。” 故此&#xff0c;本文通过讲解在本地部署 DeepSeek并配合python代码实现&#xff0c;让你零成本搭建自己的AI…

Houdini SOP层 Scatter节点

SOP 代表 Surface Operator&#xff08;几何体操作节点&#xff09;&#xff0c;所有几何体的建模、变形、分布等操作都在此层级完成。 Scatter节点的作用就是 以不同的密度在模型表面撒点 Scatter 节点属于 SOP&#xff08;几何体&#xff09;层级&#xff1a; 进入 Geometr…

【网络安全工程】任务12:网络安全设备

目录 一、防火墙​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 二、入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 三、防病毒网关​ ​1、作用​ 2、配置方式​ 3、存在的漏洞​ …

Linux 进程控制:创建、终止、等待与程序替换全解析

亲爱的读者朋友们&#x1f603;&#xff0c;此文开启知识盛宴与思想碰撞&#x1f389;。 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 目录 1.进程创建 1-1 fork函数初识​ 1-2 fork函数返回值​ 1-3…

SwiftUI 让视图自适应高度的 6 种方法(四)

概览 在 SwiftUI 的世界里&#xff0c;我们无数次都梦想着视图可以自动根据布局上下文“因势而变”‌。大多数情况下&#xff0c;SwiftUI 会将每个视图尺寸处理的井井有条&#xff0c;不过在某些时候我们还是得亲力亲为。 如上图所示&#xff0c;无论顶部 TabView 容器里子视图…

1035.不相交的线

1035.不相交的线 力扣题目链接(opens new window) 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j]且绘制的直线…