当前位置: 首页 > article >正文

Linux僵死进程及文件操作

1.僵死进程(僵尸进程):

1.僵死进程产生的原因或者条件:

什么是僵死进程?

当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程.

简而言之,就是子进程先结束,并且父进程没有获取它的退出码;

那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进程的退出码;

2.进程结束的过程以及僵死进程产生的过程:

3.观察僵死进程:

父进程执行7次,子进程改为3次;就能观察到僵死进程(放到后台运行&,ps -f);

4.处理僵死进程

(1)父进程先结束(子进程会变成孤儿进程,孤儿进程会被收养(红帽子是init(pid==1)收养孤儿进程,Unbuntu是操作系统指定了一个进程));
(2)父进程调用wait()方法获取子进程的退出码;

本质:都是调用了wait方法;

代码演示:

方法一:父进程先结束//就是把父进程的n=3,子进程的n=7即可;

方法二:显示的调用wait:

else
{
    s="parent";
    n=7;
    int val=0;
    wait(&val);
    printf("val=%d\n",val);
}

但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行;

5.处理僵死进程的意义;

僵死进程的坏处:白白消耗内存;(讲服务器代码的时候会演示)
Linux内核设计与实现27页;

6.退出码

改代码:exit(3);
执行显示val=768;
man 2 wait

WIFEXITED:正常退出的状态;
WEXITSTATUS:获取退出码;

    else//父进程
    {   
        s="parent";
        n=7;
        int val=0;
        wait(&val);
        if(WIFEXITED(val))
        {
         printf("val=%d\n",WEXITSTATUS(val));
        }
    }

7.避免僵死进程的方法总结

1)父进程先结束;

2)父进程调用wait()方法获取子进程的退出码;
其实两种处理僵死进程的方法本质都是一样的,都调用了wait获取子进程退出码(方法一是父进程先结束后子进程被Init(现在随着内核的发展不一定是1)收养,Init之后调用wait获取子进程退出码;方法二是父进程直接调用wait,)但是两种方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行.

若想父进程调用wait不阻塞,那么我们需要结合信号一起.具体在信号那一节用代码演示;

2.Linux操作文件的底层系统调用:

C语言操作文件的几个库函数:fopen,fread,fwrite,fclose;
系统调用:open,read,write,close;
系统调用方法实现在内核中;(陷入内核,切换到内核)

1.open的介绍:
open重载:两个参数用于打开一个已经存在的文件;三个参数的用于新建一个文件,并设置访问权限;
pathname:文件和路径和名称;
flags:文件的打开方式;
mode:文件的权限,如"0600";

了解特殊权限:linux系统中,文件的三种特殊权限_rwsr是什么权限-CSDN博客

关于linux权限s权限和t权限详解_目录权限t_D_R_L_T的博客-CSDN博客

open的返回值为int,称为文件描述符;
flags的打开标志,如:
O_WRONLY:只写打开;
O_RDONLY:只读打开;
O_RDWR:读写方式打开;
O_CREAT:文件不存在则创建;
O_APPEND:文件末尾追加;
O_TRUNC:清空文件,重新写入;

open的返回值是int,称之为"文件描述符";每打开一个文件,我们就会得到一个文件描述符,这个文件描述符是一个整型,通过文件描述符就可以对文件进行读写这样的操作.open失败返回-1,成功返回一个大于等于0的值;  0,1,2是默认打开的;

0:标准输入

1:标准输出

2:标准错误输出

2.write 的介绍


fd:对应打开的文件描述符
buf:写入的文件内容;
count:要写入多少个字节;
返回值:ssize_t:实际写入了多少个字节;


3.read:


fd:对应打开的文件描述符;
buf:把文件内容读取到一块空间buf中;
count:期望要读取的字节数;
返回值:ssize_t:实际读取了多少个字节;


4.close的介绍


关闭文件描述符;


5.文件描述符:


文件打开以后,内核给文件的一个编号;(>0的整数)

0:标准输入;
1:标准输出;
2:标准错误输出;

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    write(1,"hello",5);
    exit(0);
}
//往屏幕(标准输出)写入hello 5个字节


http://www.kler.cn/news/149179.html

相关文章:

  • 【ARM CoreLink 系列 8 -- SMMU 详细介绍-上半部】
  • 《微信小程序开发从入门到实战》学习三十六
  • springboot实战之stream API应用过滤不符合条件的数据
  • MySQL巧用公用表表达式(CTE)处理递归查询
  • 想学计算机视觉入门的可以看过来了
  • 牛客算法题 HJ100 等差数列 golang语言实现
  • QT配合CSS隐藏按钮
  • Springboot_文件下载功能(前端后端)
  • Kotlin学习——kt入门合集博客 kt里的委派模式Delegation kt里的特性
  • 基于C#实现Dijkstra算法
  • Java架构师软件架构开发
  • ⑨【Stream】Redis流是什么?怎么用?: Stream [使用手册]
  • 金字塔原理 读书笔记
  • 正则表达式及文本三剑客grep,awk,sed
  • 三、Lua变量
  • 学生护眼灯怎么选?2023备考护眼台灯推荐
  • CentOS 系统给nodejs 项目安装依赖报错 make: g++: No such file or directory
  • c语言-希尔排序
  • 力扣labuladong一刷day21天滑动哈希算法共2题
  • sqli-labs靶场详解(less29-less31)
  • 【工具】Zotero|使用Zotero向Word中插入引用文献(2023年)
  • Labview Lite Note
  • 关于分页的问题SQL_CALC_FOUND_ROWS
  • 每日一题:LeetCode-202.面试题 08.06. 汉诺塔问题
  • 11.28C++
  • Linux环境安装Java,Tomcat,Mysql,
  • 腾讯云轻量服务器通过Docker搭建外网可访问连接的redis5.x集群
  • CCFCSP试题编号:202109-2试题名称:非零段划分
  • leetcode每日一题35
  • Web学习笔记