首页 > 试题广场 >

对于Linux说法,下列说法正确的是?

[单选题]
对于Linux说法,下列说法正确的是()
  • 线性访问内存非法时,当前线程会进入信号处理函数
  • 用mv命令移动文件时,文件的修改时间会发生变化
  • ulimit -c设置的是函数调用栈的大小
  • malloc函数是操作系统最底层申请内存的接口
推荐
A
B:不会变化
C:ulimit用于shell启动进程所占用的资源.-c size:设置core文件的最大值.单位:blocks
D:malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具***置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
编辑于 2015-04-01 15:16:58 回复(12)
malloc是库函数,"操作系统申请内存的接口 "指的是系统调用,库函数中封装了系统调用,库函数与系统调用是两个不同的概念。所以D选项错误。
发表于 2016-07-04 11:36:21 回复(0)
malloc是glibc里的库函数,它封装了一些向系统申请内存的系统调用,而且并不是每次使用malloc的时候都会向系统申请新的内存,所以D是错的
发表于 2015-08-05 11:52:47 回复(3)
但是我选的D,我认为D没有问题,不知道为何错误。刚开始没理解A,如何进入信号处理程序的。
后来想明白,进入非法内存,就会引起非法内存访问的信号,而此信号的动作是终止程序
不知道理解是否有误?
发表于 2015-08-10 16:00:53 回复(0)
B:不会变化
C:ulimit用于shell启动进程所占用的资源.-c size:设置core文件的最大值.单位:blocks
D:malloc叫动态内存分配。
发表于 2021-11-04 16:39:19 回复(0)
malloc是一个系统函数,它封装了系统调用,这些调用将申请系统内存。
发表于 2016-07-12 20:49:12 回复(0)
mv不会改变文件的修改时间
ulimit -s 是设置函数调用栈的大小
malloc 是编程者向系统申请分配指定字节的内存空间
发表于 2015-08-04 22:32:41 回复(0)
B   文件会随着mv而改变时间 
发表于 2015-06-12 15:14:56 回复(0)
malloc只是封装的库函数不是系统调用
brk、mmap才是分配内存的系统调用
发表于 2016-08-06 12:21:45 回复(0)
ulimit  -s size:设置 堆栈 的最大值.单位:kbytes
发表于 2015-08-26 14:25:59 回复(0)

ulimit 参数说明

选项 [options] 含义 例子
-H 设置硬资源限制,一旦设置不能增加。 ulimit – Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 ulimit – Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 ulimit – a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 ulimit – c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 ulimit – f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 ulimit – l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 ulimit – m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 ulimit – n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 ulimit – s 512;限制线程栈的大小为 512 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 ulimit – t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 ulimit – u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes。

 

发表于 2017-04-06 11:37:43 回复(1)
A:访问非法内存时,发生缺页中断,调用中断处理程序,进入内核态,根本不会执行线程的什么方法
D:我认为没问题
发表于 2016-08-22 03:58:32 回复(2)

请问,A选项访问非法触发中断信号,中断若被受理,不应该是当前进程挂起,切换到异常处理么?

发表于 2015-11-11 08:44:31 回复(0)
不同的操作系统有着不同的动态内存管理方式,他们有着各自不同的实现方式,也就是应用程序向操作系统申请内存的接口,为了程序的可移植性,开发语言的库函数中会有对这些底层系统调用的封装,即malloc/free,它只是一个库函数而已,不是真正的接口
发表于 2015-08-18 09:11:04 回复(0)
A
发表于 2015-03-01 09:47:50 回复(0)

A. 当程序尝试访问非法的内存地址时,例如访问未分配或者已释放的内存,操作系统会检测到这个错误并向进程发送一个信号(通常是SIGSEGV信号)。进程会根据自定义的信号处理函数来处理这个信号。如果没有为该信号设置自定义处理函数,操作系统会默认将进程终止。

C. ulimit -c设置的是函数调用栈的大小:这个说法是不正确的。ulimit -c命令用于设置生成的核心转储文件的最大大小,而不是设置函数调用栈的大小。函数调用栈的大小可以使用ulimit -s来设置。

D. malloc函数是操作系统最底层申请内存的接口:这个说法是不正确的。malloc函数是C语言标准库中的函数,用于在堆上动态分配内存。它并不直接与操作系统的底层接***互,而是通过操作系统提供的系统调用(如brk或mmap)来向操作系统请求内存。

发表于 2023-11-01 11:07:15 回复(0)

 D为什么是错的呢,我认为没有问题啊???
                                                                                    
发表于 2015-08-02 22:33:12 回复(2)
以下是针对该题目的详细解析: ### 题目分析 **题目:** 对于Linux说法,下列说法正确的是( ) **选项:** A. 线性访问内存非法时,当前线程会进入信号处理函数 B. 用mv命令移动文件时,文件的修改时间会发生变化 C. ulimit -c设置的是函数调用栈的大小 D. malloc函数是操作系统最底层申请内存的接口 **正确答案:A** **用户答案:D** --- ### 逐项解析 #### **A. 线性访问内存非法时,当前线程会进入信号处理函数(✓ 正确)** - **原理:** 当程序访问非法内存(如未分配地址或受保护区域)时,会触发**缺页异常**(Page Fault)。Linux内核将此异常转换为**SIGSEGV信号**(段错误信号)。如果程序注册了信号处理函数(如通过`sigaction()`),当前线程会中断正常执行流程,跳转到该信号处理函数。 - **关键点:** - 信号处理函数需提前注册。 - 未注册时进程会直接终止(产生core dump)。 - **示例:** 访问空指针(`*ptr = 0;`)会触发SIGSEGV,进入信号处理函数(若存在)。 --- #### **B. 用mv命令移动文件时,文件的修改时间会发生变化(✗ 错误)** - **原理:** `mv`命令的行为分两种情况: 1. **同文件系统移动:** 仅修改文件路径(目录项),**不改变文件inode信息**。 - 修改时间(`mtime`)**不变**(文件内容未修改)。 - 状态变更时间(`ctime`)**更新**(因路径变化)。 2. **跨文件系统移动:** 实质是复制+删除原文件,新文件**继承内容但inode更新**,此时`mtime`和`ctime`均更新。 - **结论:** 选项未区分场景,笼统声称“修改时间变化”是错误的(同文件系统下`mtime`不变)。 --- #### **C. ulimit -c设置的是函数调用栈的大小(✗ 错误)** - **ulimit命令作用:** `ulimit`用于控制进程资源限制: - **`-c`选项:** 设置**core dump文件大小**(单位为512B块)。 ```bash ulimit -c unlimited # 允许生成任意大小的core dump ``` - **栈大小设置:** 使用 **`-s`选项**(如`ulimit -s 8192`设置栈为8MB)。 - **结论:** 选项混淆了`-c`(core dump)和`-s`(stack size)的功能。 --- #### **D. malloc函数是操作系统最底层申请内存的接口(✗ 错误)** - **malloc的本质:** - `malloc`是**C标准库(glibc)提供的函数**,非操作系统底层接口。 - 底层内存申请依赖**系统调用**: - `brk()`/`sbrk()`:调整堆内存边界。 - `mmap()`:直接映射虚拟内存(大块内存)。 - **工作流程:** ```plaintext 应用程序调用 malloc() → glibc 内存管理器 → 调用 brk() 或 mmap() 系统调用 → 内核分配物理内存 ``` - **结论:** `malloc`是库函数封装,最底层接口是系统调用(如`brk`/`mmap`)。 --- ### 错误答案分析(用户选择D) - **误解根源:** 混淆了**库函数**和**操作系统接口**的层级关系。 - **正确认知:** 操作系统通过系统调用(syscall)提供服务,库函数(如`malloc`)是对syscall的封装,提供更易用的抽象。 --- ### 总结 | 选项 | 结论 | 关键原因 | |------|------|----------| | A | ✓ | 非法内存访问触发SIGSEGV信号,进入注册的处理函数 | | B | ✗ | 同文件系统移动不改变文件修改时间(mtime) | | C | ✗ | `ulimit -c` 控制core dump大小,栈大小用 `-s` | | D | ✗ | `malloc` 是glibc库函数,底层依赖`brk`/`mmap`系统调用 | **学习建议:** - 理解Linux信号机制(`signal`/`sigaction`)。 - 掌握文件元数据(`atime`/`mtime`/`ctime`)的区别。 - 区分库函数和系统调用的层级关系(`man 2 syscalls`查看系统调用)。
发表于 2025-07-10 14:15:23 回复(0)
非法最终会触发段错误,段错误应该就是信号处理函数引发的吧
发表于 2025-02-19 22:26:04 回复(0)
操作系统最底层申请空间方式的应该是brk()\sbrk()+mmap()吧
发表于 2023-08-10 08:36:46 回复(0)

如果目录 B 与文件 A 所在的目录不在同一个文件系统,则文件 A 的内容会被复制到目录 B 并删除原来的文件 A,这个操作会导致文件 A 的修改时间更新。如果目录 B 与文件 A 所在的目录在同一个文件系统,则文件 A 只会在文件系统目录中的位置被更新,其他元数据信息如 inode 号等都不会改变,这种情况下文件 A 的修改时间不会更新。


发表于 2023-04-28 16:38:53 回复(0)