TLPI-Chapter 12系统和进程信息

BUG调试案例一:RK3588+YT8531网络无法PING通调试案例 在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步) 阅读详情

“The /proc file system exposes a range of kernel information to application programs. Each /proc/PID subdirectory contains files and subdirectories that provide information about the process whose ID matches PID. Various other files and directories under /proc expose system-wide information that programs can read and, in some cases, modify.
The uname() system call allows us to discover the UNIX implementation and the type of machine on which an application is running.”
摘录来自: Michael Kerrisk. “The Linux Programming Interface”。 iBooks.
proc文件系统向应用程序揭露了一系列内核信息。每个/proc/PID子目录都包含许多文件和子目录,为进程ID为PID的进程提供相关信息。/proc目录下其它文件和目录揭露了应用程序可以读取在某些情况下甚至修改。
使用uname()系统调用,能够获取UNIX的实现信息以及应用程序锁运行的机器类型。
在阅读Linux/UNIX系统编程手册时,中文部分阅读不明白,在iBooks中阅读英文原著发现竟出奇的好理解。

#include <fcntl.h>
#include "tlpi_hdr.h"

#define MAX_LINE 100

int
main(int argc, char *argv[])
{
    int fd;
    char line[MAX_LINE];
    ssize_t n;

    fd = open("/proc/sys/kernel/pid_max", (argc > 1) ? O_RDWR : O_RDONLY);
    if (fd == -1)
        errExit("open");

    n = read(fd, line, MAX_LINE);
    if (n == -1)
        errExit("read");

    if (argc > 1)
        printf("Old value: ");
    printf("%.*s", (int) n, line);

    if (argc > 1) {
        if (lseek(fd, 0, SEEK_SET) == -1)
            errExit("lseek");

        if (write(fd, argv[1], strlen(argv[1])) != strlen(argv[1]))
            fatal("write() failed");

        system("echo /proc/sys/kernel/pid_max now contains "
               "`cat /proc/sys/kernel/pid_max`");
    }

    exit(EXIT_SUCCESS);
}

该程序展示了如何读取和修改一个/proc/sys/kernel/pid_max文件的内容。如果提供多余两个参数,则用第二个参数取代,如果参数不合法则写入失败,合法性判断是由linux系统所判断,如果只输入./procfs_pidmax则时显示该数值。
我们可以尝试输入 echo invalid > /proc/sys/kernel/pid_max,则会提示-bash: echo: write error: Invalid argument

系统标识

uname系统调用】

功能描述:
获取当前内核名称和其它信息。
用法:

#include <sys/utsname.h>
/* Put information about the system in NAME.  */
extern int uname (struct utsname *__name) __THROW;
参数: 
__name:指向存放系统信息的缓冲区,原型如下
/* Structure describing the system and machine. */
struct utsname
  {
    /* Name of the implementation of the operating system. */
    char sysname[_UTSNAME_SYSNAME_LENGTH];   //当前操作系统名
    /* Name of this node on the network. */
    char nodename[_UTSNAME_NODENAME_LENGTH]; //网络上的名称
    /* Current release level of this implementation. */
    char release[_UTSNAME_RELEASE_LENGTH];   //当前发布级别
    /* Current version level of this release. */
    char version[_UTSNAME_VERSION_LENGTH];   //当前发布版本
    /* Name of the hardware type the system is running on. */
    char machine[_UTSNAME_MACHINE_LENGTH];   //当前硬件体系类型
  };
  ``` 

``` C
/*************************************************************************\
*                  Copyright (C) Michael Kerrisk, 2015.                   *
*                                                                         *
* This program is free software. You may use, modify, and redistribute it *
* under the terms of the GNU General Public License as published by the   *
* Free Software Foundation, either version 3 or (at your option) any      *
* later version. This program is distributed without any warranty.  See   *
* the file COPYING.gpl-v3 for details.                                    *
\*************************************************************************/

/* Listing 12-2 */

/* t_uname.c

   Demonstrate the use of the uname() system call, which returns various
   identifying information about the system.
*/




<div class="se-preview-section-delimiter"></div>

#ifdef __linux__




<div class="se-preview-section-delimiter"></div>

#define _GNU_SOURCE




<div class="se-preview-section-delimiter"></div>

#endif




<div class="se-preview-section-delimiter"></div>

#include <sys/utsname.h>




<div class="se-preview-section-delimiter"></div>

#include "tlpi_hdr.h"

int
main(int argc, char *argv[])
{
    struct utsname uts;

    if (uname(&uts) == -1)
        errExit("uname");

    printf("Node name:   %s\n", uts.nodename);
    printf("System name: %s\n", uts.sysname);
    printf("Release:     %s\n", uts.release);
    printf("Version:     %s\n", uts.version);
    printf("Machine:     %s\n", uts.machine);




<div class="se-preview-section-delimiter"></div>

#ifdef _GNU_SOURCE
    printf("Domain name: %s\n", uts.domainname);




<div class="se-preview-section-delimiter"></div>

#endif
    exit(EXIT_SUCCESS);
}

程序比较简单,我们可以man uname 参考手册中的内容与程序输出进行比较。

【人工智能】Claude Code 安装、配置及问题排查完整指南 建议使用IDE来启动 Claude,执行后,内容如下。(确保环境可正常运行 npm 命令)。 阅读详情

相关推荐

从零到一:基于DESeq2的转录组差异表达分析实战指南

本文详细介绍了基于DESeq2的转录组差异表达分析实战指南,涵盖数据准备、标准化处理、差异分析及结果解读等关键步骤。DESeq2凭借其稳定性和对低表达基因的友好处理,成为转录组数据分析的首选工具。文章还提供了常见问题排查和优化建议,帮助研究者高效完成从分析到发表的完整流程。

weixin_26759093的博客 270

linux kill tl进程,【linux】kill ;杀死某一用户下的所有进程

在一台100多人使用的 SUN 服务器上经常发现有人滥用资源,平时用用就算了,到了交作业的时候100多号人同时登录使用,服务器明显迟缓,特别是实验室用的是瘦客户机,没硬盘,SUN 客户端需要从服务器装载系统镜像,而且编译、运行程序都要在服务器上完成。如果发现某个用户运行很多进程,并且进程还有子进程,怎么能方便的找出全部进程 并 kill 掉呢?ps -ef | grep ^username | c...

weixin_35160622的博客 710

LLVM实战:如何用Clang+LLVM打造你的第一个C++编译器(附完整配置步骤)

本文详细介绍了如何使用Clang+LLVM构建C++编译器的完整配置步骤,从环境准备到编译流程剖析,再到调试与优化技巧。通过实战指南,帮助开发者深入理解LLVM编译器框架的工作原理,并掌握交叉编译与性能分析等高级功能。

sprite的博客 746

linux 进程状态 tl6,线程的6种状态

Thread类中定义了一个枚举类型State,描述了线程的6种状态public enum State {NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED;}jdk1.8 api对Thread.State的解释,详见官网apiA thread state. A thread can be in one of the following sta...

weixin_39813574的博客 907

海康安防平台接口调试指南:从签名生成到Vue项目集成

本文详细解析了海康安防平台接口认证规则,从签名生成到Vue项目集成的完整流程。通过核心机制解析、签名工具使用技巧及Vue项目中的优雅集成方案,帮助开发者高效完成接口调试,避免常见问题。特别适合需要将海康安防平台接口集成到Vue项目中的开发者参考。

weixin_42533120的博客 437

Depth Anything 3实战:如何用DINOv2 Transformer一键生成3D高斯点云?

本文详细介绍了Depth Anything 3(DA3)模型如何利用DINOv2 Transformer架构,实现从单张或多视角图像一键生成高质量3D高斯点云。DA3通过统一的深度-射线表示和自适应注意力机制,简化了传统复杂的3D重建流程,并可直接微调用于3D高斯渲染,为图形学、CV和内容创作领域提供了高效的端到端解决方案。

postgres8guard的博客 722

Linux进程管理---进程的状态(R,S,D,T,t,X,Z)

在了解了什么是进程,以及进程的创建之后,我们需要知道进程其实有不同的状态,一个进程可以有几种状态。

分享学习的知识,记录我的技术成长道路 5799

单目视觉定位:深入解析PNP算法在机器人导航中的实战应用

本文深入解析了PNP算法在机器人单目视觉定位中的核心原理与实战应用。通过拆解坐标变换四步,详细阐述了如何从二维图像点反求相机三维位姿。文章结合OpenCV的solvePnP函数,提供了算法选择、参数调优及结果后处理的实用指南,并针对机器人导航中的特征匹配、尺度不确定性等挑战,给出了鲁棒性优化与实时性平衡的解决方案。

weixin_29083649的博客 419

Linux进程状态(ps stat)之R、S、D、T、Z、X

一、进程的状态表述:#define TASK_RUNNING 0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE 2#define TASK_STOPPED 4#define TASK_TRACED 8/* in tsk->exit_state */#define EXIT_ZOMBIE 16#d

学海无涯,回头是岸........ 8185

手把手教你学 MATLAB 实战训练(6.5):基础实战实例

MATLAB 是一款强大的数学软件,广泛应用于工程计算、信号处理、控制系统设计、图像处理等领域。学习 MATLAB 不仅可以提高你的编程技能,还能帮助你解决实际的数学和工程问题。下面我将通过几个实战训练实例来教你如何使用 MATLAB。

xiaoheshang_123的博客 366

binning模式下和normal模式下相同曝光参数相同场景加权亮度差异消除方案优化(一)

摘要:针对ISP参数设置中浮点权重系数需转换为整数的问题,提出整数邻域搜索方案。该方法在浮点最优解附近(±1/±2)进行局部搜索,通过逐阶微调找到误差最小的整数权重组合,避免直接取整导致的误差反弹(误差从0.8%降至0.35%)。方案结合范围约束(1~15)和单调性约束(暗端递减、亮端递增),兼顾计算效率(单图耗时<10ms)与硬件兼容性,显著优于暴力搜索和简单取整,满足工程落地需求。

大熊 94

Linux下的进程状态

Linux下的进程状态 一般来说, Linux中的进程状态主要有如下几种: 1.        R (TASK_RUNNING),可执行状态。 2.        S (TASK_INTERRUPTIBLE),可中断的睡眠状态。 3.        D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态。 4.        T (TASK_STOPPED or TASK_

Shine's Blog 3554

【一看就会】autoware universe项目结构解析——从一层一层直到control源码

下载安装autoware universe花了一天。下载好之后,按照网上说的跑了一下仿真是能跑的,证明下的代码没问题。然后就得看一下各模块实现的源码了。但是当我打开这些文件的时候。我勒个豆。这么多是个玩意儿。我连该启动哪个launch文件,哪个文件夹是干啥的都不知道。在我慢慢弄懂之后,我也记录这个庞大的项目的各个文件夹和里面的文件以及项目,以及自己使用时应该启动哪些launch文件。这篇文章目的就是通过找到control部分的源码,来帮助我们梳理这个庞大项目的各个文件的功能。

weixin_48386130的博客 2037

TLPI-Chapter 6 进程

每个进程都有一个唯一进程标识号(process ID),并保存有对其父进程号的记录。 进程的虚拟内存逻辑上被划分为许多段:文本段、数据段、栈和堆。 栈由一系列帧组成,随函数调用而增长,随函数返回而减,每个帧都包含有函数局部变量、函数实参以及单个函数调用的调用链接信息。 程序调用时命令行参数通过argc argv参数提供给main()函数。通常argv[0]包含调用程序的名称。 每个进程都会获

尘世中迷途小书童 364

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TLPI-Chapter 9 进程凭证

这一章开始看的有点懵,在网上搜索到一篇文章有助于理解链接地址Set-User-ID 1.每个进程都有一套用数字表示的用户ID和组ID。具体有实际用户ID(real user ID), 实际组ID(real group ID),有效用户ID(effective user ID),有效组ID(effective group ID),保存的set-user-ID和set-group-ID,文件系统用户I

尘世中迷途小书童 763

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TLPI-Chapter 11系统限制和选项

关于系统限制C语言标准和SUSv3提供了两种方法: 1.在编译程序时能够获得一些限制和选项。 2.一些限制在程序运行时可能会发生变化。对此SUSv3定义了3个函数sysconf() pathconf()和fpathconf(),供应用程序调用以检查系统实现的限制和选项。 SUSv3将其规定的限制归为三类: 运行时恒定值 路径名变量值 运行时可增加值 在shell中,可以使用getco

尘世中迷途小书童 849

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TLPI-Chapter 20 信号

基本概念信号是事件发生时对进程的通知机制。有时也称为软件中断,信号与硬件中断相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。 一个具有合适权限的进程能够向另一进程发送信号,信号的这一用法可作为一种同步技术,甚至是进程通信IPC的原始形式。进程也可以向自身发送信号。然而发往进程的诸多信号,通常都是源于内核。 引发内核为进程产生信号的各类事件如下: 硬件发生异常:硬

尘世中迷途小书童 477

TLPI-Chapter 5深入探究文件

原子操作 UNIX/Linux系统编程手册第5章深入探究文件I/O,所有的系统调用都是以原子操作方式执行。 内核保证系统调用中的所有步骤会作为一个独立操作而一次性加以执行,期间不会为其它进程或线程中断. 下面的代码中open并未使用O_EXCL标志,在程序中为了对执行该程序的进程加以区分,打印了进程号。 /****************************************

尘世中迷途小书童 356

TLPI-Chapter 3系统编程概念

第三章内容概念讲的其实相对好理解,主要有如下几点: 系统调用是可控的内核入口,进程可以请求内核以自己的名义去执行某些动作,这就用到了系统调用,讲处理器从用户态切换到内核态。 在书中作者用到一个例子X86-32为例,按事件发生顺序: 1.应用程序通过外壳(wapper)函数,发起系统调用 2.参数入栈,传入外壳函数。 3.外壳函数将参数置入特定寄存器(包括系统调用编号) 4执行中断机器指令

尘世中迷途小书童 294

TLPI-Chapter 10 时间

日历时间Calendat TimeUNIX系统内部对时间的表示均是以自1970年1月1日的零点以来的秒数来度量。日历时间存储与类型time_t的变量中,此类型是由SUSv3定义的整数类型。 系统调用gettimeofday(),可于tv指向的缓冲区中返回日历时间。#include <sys/time.h> int gettimeofday(struct timeval *tv, struct ti

尘世中迷途小书童 360

TLPI-Chapter 4文件IO

所有执行I/O操作的系统调用都以文件描述符(一个非负整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道、FIFO、socket、终端、设备、普通文件。它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。每个进程,文件描述符都自成一套。 三种标准的文件描述符: 0 标准输入 1 标准

尘世中迷途小书童 506

TLPI-Chapter 13文件I/O缓冲

函数:void *memalign(size_t alignment, size_t size); The obsolete function memalign() allocates size bytes and returns a pointer to the allocated memory. The memory address will be a multiple of alignment

尘世中迷途小书童 374

进程操作

//需要引用 TLHelp32单元 //根据 进程名结束进程 //调用 EndProcess('QQ2013') procedure EndProcess(AFileName: string); const PROCESS_TERMINATE = $0001; var ExeFileName: String; ContinueLoop: BOOL; FSnapshotHandle

123 604

进程-进程之进程状态(R、S、D、T、Z、X)

进程概念: 1)正在执行的程序 2)正在计算机上执行的程序实例 3)能分配处理器并由处理器执行的实体 进程的两个基本元素是程序代码和代码相关联的数据集。进程是一种动态描述,但并不代表所有的进程都在运行。这就可以引入‘进程状态’。 进程在内存中因策会略或调度需求, 会处于各种状态:Linux下的进程状态:static const char * const task_state_ar

草根学僧 1万+

Linux 进程状态 说明

<br /> <br />       Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序,就必然会产生很多的进程,而每个进程会有不同的状态。 在下文将对进程的<br />R、S、D、T、Z、X 六种状态做个说明。<br /> <br />PROCESS STATE CODES<br />       Here are the different values that the s, stat and state output specifiers (header "STAT" or "S

David Dai -- Focus on Oracle 4万+

郭健: 进程切换分析之——TLB处理

一、前言进程切换是一个复杂的过程,本文不准备详细描述整个进程切换的方方面面,而是关注进程切换中一个小小的知识点:TLB的处理。为了能够讲清楚这个问题,我们在第二章描述在单CPU场景下一些...

宋宝华 3438
上一篇: GCC常用用法总结
下一篇: C程序经典程序集锦(一)
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值