「Linux下宏nofile」——如何管理系统文件描述符数量 (linux下宏nofile)

Linux 下宏 nofile——如何管理系统文件描述符数量

在 Linux 系统中,每个进程都有一个文件描述符表,用于表示当前进程打开的文件或网络连接等资源。每个文件或网络连接都是由一个文件描述符唯一标识。文件描述符是一个非负整数,通常是从 0 开始按顺序分配的。在 Linux 系统中,默认情况下,每个进程最多可以打开 1024 个文件描述符。如果进程需要打开更多的文件或网络连接,就需要调整系统的文件描述符数量限制,否则系统会返回 “Too many open files” 错误信息。

为了解决这个问题,Linux 内核提供了文件描述符数量限制控制机制,可以通过系统参数、ulimit 命令和 PAM 模块等方式来限制进程的更大文件描述符数量。其中,最常用的是修改 /etc/security/limits.conf 文件,通过设置 nofile 参数来限制进程的文件描述符数量。

在 Linux 系统中,nofile 是指一个用户能够打开的更大文件描述符数量。在 /etc/security/limits.conf 文件中,可以为每个用户或用户组设置 nofile 参数。例如,

“`

* soft nofile 65535

* hard nofile 65535

“`

这个设置表示,所有用户和用户组的软限制和硬限制都可以打开最多 65535 个文件描述符。软限制是指当前进程可以打开的更大文件描述符数量,而硬限制是指系统最多支持的文件描述符数量。

软限制和硬限制的区别在于,软限制可以被进程自己修改,但是不能超过硬限制;而硬限制只能由 root 用户修改,并且不能被超过。因此,如果需要提高软限制,可以采用以下方法:

1. 设置某个进程的文件描述符数量限制

可以使用 ulimit 命令来设置当前 shell 进程的文件描述符数量限制。例如,

“`

ulimit -n 65535

“`

这个命令表示设置当前 shell 进程的软限制和硬限制为 65535。一旦设置了软限制,可以通过修改 /etc/security/limits.conf 文件来将软限制永久应用到该用户或用户组下的所有进程中。

2. 修改系统级别的文件描述符数量限制

在 /etc/security/limits.conf 文件中,可以为所有用户或用户组设置文件描述符数量限制。使用 root 用户可以编辑这个文件,例如,

“`

* soft nofile 65535

* hard nofile 65535

“`

这个设置被加入到 /etc/security/limits.conf 文件中,将系统级别的文件描述符数量限制设置为 65535。注意,这个设置只影响新启动的进程,对于已经运行的进程不会产生影响。如果需要使设置立即生效,可以重启系统或重新启动服务。

3. 修改 PAM 模块配置

PAM(Pluggable Authentication Modules)是 Linux 系统中的一个底层库,它负责系统认证、账户管理和授权管理等功能。有些 Linux 发行版默认使用 PAM 模块来管理系统级别的文件描述符数量限制。可以修改 PAM 模块配置文件来修改文件描述符数量限制。

例如,在 Ubuntu 系统中,可以修改 /etc/pam.d/common-session 文件来设置文件描述符数量限制。在这个文件中,可以添加以下两行:

“`

session required pam_limits.so

session required pam_systemd.so

“`

这个设置的作用是,在用户登录或注销时,使用 pam_limits.so 模块和 pam_systemd.so 模块来修改文件描述符数量限制。同样,修改 PAM 模块配置需要重启系统或重新启动服务才能使设置生效。

文件描述符数量限制是 Linux 系统中一个重要的问题,如果设置不当,会导致系统出现许多问题。为了避免这个问题,可以通过修改 /etc/security/limits.conf 文件、使用 ulimit 命令和修改 PAM 模块配置等方法来控制文件描述符数量限制。我们可以根据实际需求来设置软限制和硬限制,以便于满足进程的需要。在实际应用中,我们需要注意设置文件描述符数量限制的过程中要谨慎,需要充分测试和验证之后再进行生产环境的使用。

相关问题拓展阅读:

  • 如何将linux下的程序,移植到freertos中
  • Linux下的c编程:系统调用

如何将linux下的程序,移植到freertos中

方法/步骤

嵌入式操作系统有分时操作系统和实时操作系统,如果操作系统能够使计算机系统及时响应外部事件请求,并能控制所有实时设备和实时任务协调运行,且能在一个规定的时间内完成对事件的处理,怎么这种系统称为实时操作系统。

如果系统必须在极其严格的时间内完成的任务叫做硬件的实时操作系统,如果不是很严格的话就是软件的实时操作系统。

前往官网下载最新版的FreeRTOS系统,然后解压缩到本地。有两个文件夹,FreeRTOS文件夹里面是操作系统内核,FreeRTOS-Plus里面是一些中间件如文件系统,网络协议栈等。

值得一提的是,FreeRTOS的教学用书和API参考手册电子版均已免费提供,建议在现在安装FreeRTOS的同时也一并下载到本地,以供后期学习查阅。

FreeRTOS的主要特点如下:

1. 支持抢占式调度,合作式调度和时间片调度

2. 具有低功耗模式,称为tickless模式

3. FreeRTOS-MPU支持M3/M4/M7内核的MPU(内存保护单元)

4. 典型的内核使用大小在4k~9k

5. 支持消息队列、二值信号量、计数信号量、递归信号量和互斥信号量,可用于任务与任务之间的消息传递和同步,任务与终端间的消息传递和同步老毁

6. 任务数量不限,任务优先级数量不限

7. 高效的软件定时器,不需要损耗额外的CPU时间,除非需要执行定时器任务

8. 任务间直接的消息传递,速度较快

9. FreeRTOS的队列是其它通信和同步机制的基础

移植FreeRTOS之前,原有的工程(比如跑马灯,越简单越好)中不能有SysTick、PendSV和SVC三个系统中断的使用,因为FreeRTOS系统要使用这三个中断。

1. 准备好简单工程的模板

2. 在工程模板中创建FreeRTOS文件夹,并将解压后源码FreeRTOS文件夹中Source目录下的所有姿含悄内容复制进来

3. 在user目录下需要手动窗件FreeRTOSConfig.h的配置文件,也可以从官方demo中拿来修改后使用,比如从下载的源码目录下的FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK中进行拷贝

4. 将源码文件添加到MDK的工程目录中,其中heap_4.c文件路径Source/portable/MemMang,port.c的路径FreeRTOS/Source/portable/RVDS/ARM_CM4F,这是因为我们使用的M451是CM4F内核的

在工程中添加新的头迹渣文件搜索路径:

.\FreeRTOS\include;

.\FreeRTOS\portable\RVDS\ARM_CM4F

打开FreeRTOSConfig.h配置文件,根据自己硬件配置进行修改

1. 首先将文件开头的__ICCARM__修改为__CC_ARM,即把编译器从IAR改为RealView

2. 将以下宏配置为0

configUSE_IDLE_HOOK

configUSE_TICK_HOOK

configCHECK_FOR_STACK_OVERFLOW

configUSE_MALLOC_FAILED_HOOK

3. #define configUSE_PREEMPTION1 将会使能抢占式调度器

4. #define configCPU_CLOCK_HZ( SystemCoreClock )设置系统主频(M451的系统主频为72MHz)

5. #define configTICK_RATE_HZ( ( TickType_t ) 1000 )设置系统节拍为1kHz,即1ms

6. #define configMAX_PRIORITIES( 5 )定义可供用户使用的更大优先级数为5,那么用户可以使用的优先级号是0,1,2,3,4

6. #define configTOTAL_HEAP_SIZE( ( size_t ) ( 30 * 1024 ) )定义堆大小,FreeRTOS内核,用户动态申请内存,任务栈等都需要这个空间

4. 将工程整体重新编译一次,这样FreeRTOS基本移植结束了

编写测试程序来验证一致的FreeRTOS是否已经可以使用

1. 在main.c中添加一下几个头文件

#include “FreeRTOS.h”

#include “task.h”

#include “queue.h”

#include “croutine.h”

2. 在main函数的开头,禁止全局中断(除了NMI和HardFault),具体方法是:__set_PRIMASK(1);这样做的好处是可以防止执行的中断服务程序中有FreeRTOS的API函数,保证系统正常启动,不受别的中断影响。在port.c中的函数prvStartFirstTask中会重新开启全局中断

3. 创建任务AppTaskCreate();

4. 启动调度,开始执行任务vTaskStartScheduler();

烧写程序,运行,可以从串口看到正确的输出信息

Linux下的c编程:系统调用

标准的c函数库是所有的编译都要具有的函数库,(实际上还是略有不同),但是这些基本上实现方法略有不同,但是结果和标准是一样的。但是linux的系统调用,调用是linux的系统库档旦燃,比如说unistd.h下的fork这个是Linux下特迟斗有,你在vs上,就没有这个库,也没有这行虚个函数。同样在vs上写c,你可以引入头文件比如windows.h,显然这个库是Linux不具有的。简单说系统调用库根据具体的操作系统环境不同而不同,而c标准库,是所有支持c语言编译器都有的。

linux c system函数介绍:

system(执行shell 命令)

相关函数

fork,execve,waitpid,popen

表头文件

#i nclude

定义函数

int system(const char * string);

函数说明

system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT和SIGQUIT 信号则会被忽略。

返回值

=-1:出现错误

=0:调用成功但是没有出现子进程

>0:成功退出的子进程的id

如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值>。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为 system()调用/bin/sh失败所返回的127,因此更好能再检查errno 来确认执行成功。

附加说明

在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过握猜环境变量可能会造成系统安全的问题。

范例

#i nclude

main()

{

system(“ls -al /etc/passwd /etc/shadow”);

}

执行结果:

-rw-r–r– 1 root root 705 Sep 3 13 :52 /etc/passwd

-rroot root 572 Sep 2 15 :34 /etc/shado

例2:

char tmp;

sprintf(tmp,”/bin/mount -t vfat %s /mnt/u”,dev);

system(tmp);

其中dev是/dev/sda1。

system函数的源码

#include

#include

#include

#include

int system(const char * cmdstring)

{

pid_t pid;

int status;

if(cmdstring == NULL){

return (1);

}

if((pid = fork())

status = -1;

}

else if(pid = 0){

execl(“/bin/sh”, “sh”, “-c”, cmdstring, (char *)0);

-exit(127); //子进程正常执行则不会执行此语句

}

else

{

while(waitpid(pid, &status, 0)

if(errno != EINTER)

{

status = -1;

break;

}

}

}

return status;

}

那么贺世如何获得system的返回值呢??

char buf;

char * ps=”ps -ef|grep -c root”;

FILE *ptr;

int i;

if((ptr = popen(ps, “r”)) != NULL)

{

fgets(buf, 10 , ptr);

i = atoi(buf);

pclose(ptr);

}

可以man下waitpid查看下如何检查status的值

int ret = system(“ls -al /禅皮肢etc/passwd /etc/shadow”);

if(WIFSIGNALED(ret))

linux下宏nofile的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux下宏nofile,「Linux下宏nofile」——如何管理系统文件描述符数量,如何将linux下的程序,移植到freertos中,Linux下的c编程:系统调用的信息别忘了在本站进行查找喔。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/157474.html<

(0)
运维的头像运维
上一篇2025-03-16 09:38
下一篇 2025-03-16 09:39

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注