题目 1
题目:Linux 文件权限 -rwxr-xr-x
是什么意思,怎样变更文件夹以及下面所有文件的拥有者?
正确答案:A
知识点:
-
文件权限:
-rwxr-xr-x
表示文件权限:- 第一个
-
表示文件类型,如果是d
则表示目录。 rwx
表示文件所有者的权限:可读(r)、可写(w)、可执行(x)。r-x
表示文件所有者所在组的用户权限:可读(r)、不可写(-)、可执行(x)。r-x
表示其他用户的权限:可读(r)、不可写(-)、可执行(x)。
- 第一个
-
变更文件拥有者:
chown
命令用于更改文件或目录的所有者。chown [-R] [用户名称] [文件或目录]
:-R
选项表示递归地更改目录及其子目录下的所有文件和子目录的所有者。
示例:
- 假设有一个文件
file.txt
,其权限为-rwxr-xr-x
,表示属主有读、写、执行权限,属组用户和其他用户只有读、执行权限。 - 要更改文件夹
/myfolder
及其所有子文件和子目录的所有者为newuser
,可以使用命令:chown -R newuser /myfolder
题目 2
题目:假如你想计划让系统自动在每个月的第一天早上4点钟执行一个维护工作,以下哪个 cron 是正确的?
正确答案:A
知识点:
- cron 格式:
- cron 任务格式为:
分钟 小时 日 月 星期 命令
。 *
表示任意值。-
表示范围。,
表示列表中的任意值。
- cron 任务格式为:
解析:
00 4 1 1-12 * /maintenance.pl
表示每月第一天的 04:00 执行/maintenance.pl
。00
表示分钟,即 00 分钟。4
表示小时,即 04:00。1
表示日期,即每月的第一天。1-12
表示月份,从 1 月到 12 月。*
表示星期,即每周的每一天。/maintenance.pl
表示要执行的命令或脚本。
示例:
- 编辑
/etc/crontab
或用户家目录下的.crontab
文件添加如下行:00 4 1 1-12 * /maintenance.pl
题目 4
题目:Linux 的系统调用是指?
正确答案:D
知识点:
- 系统调用:
- 系统调用是用户进程请求内核执行特定操作的接口。
- 用户程序通过系统调用进入内核模式执行。
示例:
- 常见的系统调用包括
open
、close
、read
、write
等。 - 例如,当一个程序想要打开一个文件时,它会调用
open
系统调用,然后内核负责执行打开文件的实际操作。
题目 5
题目:批量删除当前目录下后缀名为 .c
的文件。如 a.c
、b.c
。
正确答案:AB
知识点:
-
删除文件:
rm
命令用于删除文件。*.c
用于匹配所有以.c
结尾的文件。
-
使用 find 命令:
find
命令用于查找文件。-maxdepth
选项用于限制搜索的最大深度。xargs
命令用于将输入转化为命令行参数。
示例:
- 使用
rm
命令删除所有.c
文件:rm *.c
- 使用
find
命令结合xargs
删除所有.c
文件:find . -name "*.c" -maxdepth 1 | xargs rm
题目 6
题目:在 RHEL5 系统中,小王希望将他执行 ls
命令的输出结果保存在当前目录下文件 output.ls
中,以供日后进行分析和使用,但要求不覆盖原文件的内容,他应该使用的命令是()。
正确答案:B
知识点:
- 重定向操作符:
>
:将命令的标准输出重定向到指定文件。如果文件存在,则会被覆盖。>>
:将命令的标准输出追加到指定文件。如果文件不存在,则创建新文件。
解析:
ls > output.ls
:会将ls
命令的输出重定向到output.ls
文件中,如果output.ls
文件已存在,则会被覆盖。ls >> output.ls
:会将ls
命令的输出追加到output.ls
文件中,如果output.ls
文件已存在,则不会被覆盖,而是将新的输出内容追加到文件末尾。
示例:
- 如果
output.ls
文件已经存在并且内容为:file1 file2
- 使用
ls >> output.ls
命令后,假设当前目录下还有file3
和file4
,则output.ls
文件内容变为:file1 file2 file3 file4
题目 7
题目:在 Linux 中,对 file.sh
文件执行 #chmod 645 file.sh
中,该文件的权限是()。
正确答案:D
知识点:
- 权限数字表示法:
645
表示权限:6
:属主权限:读(4) + 写(2) + 无执行权限(0)4
:属组权限:读(4) + 无写权限(0) + 无执行权限(0)5
:其他用户权限:读(4) + 无写权限(0) + 执行(1)
解析:
645
对应的权限为-rw-r--r-x
示例:
chmod 645 file.sh
:设置file.sh
的权限为-rw-r--r-x
。- 属主(owner)有读(r)和写(w)权限,无执行权限。
- 属组(group)用户有读(r)权限,无写(w)权限,无执行权限。
- 其他用户(other)有读(r)权限,无写(w)权限,有执行(x)权限。
题目 8
题目:在 Linux 中,当我们用 ls -al
命令列出当前目录下面的文件列表,哪个文件是符号连接文件()。
正确答案:D
知识点:
- 文件类型标志:
-
:普通文件。d
:目录。l
:符号链接文件(symbolic link)。
解析:
- 符号链接文件在
ls -al
输出中会以l
开头。 lrwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng- peng.yan1
表示这是一个符号链接文件。
示例:
ls -al
输出:lrwxr--r-- 1 hel users 2024 Sep 12 08:12 cheng- peng.yan1
l
表示这是一个符号链接文件。
题目 9
题目:内核不包括的子系统是 。
正确答案:D
知识点:
- 内核子系统:
- 进程管理系统:负责进程的管理和调度。
- 内存管理系统:负责内存的分配和管理。
- I/O 管理系统:负责输入输出设备的管理和控制。
- 硬件管理系统:这不是一个常见的内核子系统名称,通常内核直接管理硬件资源。
解析:
- 内核通常包括进程管理系统、内存管理系统、I/O 管理系统等,但不包括所谓的“硬件管理系统”。
示例:
- 内核管理硬件资源的方式通常是通过设备驱动程序来实现的。
题目 10
题目:关于 Linux 系统上同一个程序的多个进程实例共享一个 TCP 监听端口的说法,哪个不正确?
正确答案:D
知识点:
- TCP 端口共享:
- 多个进程可以共享同一个 TCP 端口,前提是它们都使用
SO_REUSEPORT
选项。 - 每个进程可以绑定到不同的网卡地址上的同一端口。
- 一个进程可以先绑定到监听地址端口,然后
fork
子进程共享使用。
- 多个进程可以共享同一个 TCP 端口,前提是它们都使用
解析:
- 选项 A 正确:每个进程都使用
SO_REUSEPORT
选项,然后绑定同一个地址和端口。 - 选项 B 正确:每个进程分别绑定不同的网卡地址的同一端口。
- 选项 C 正确:第一个进程先绑定到监听地址端口,然后
fork
子进程共享使用。 - 选项 D 不正确:每个进程分别绑定一次,但只有最后一个调用的进程才能收到数据。实际上,使用
SO_REUSEPORT
选项可以让多个进程共享同一个端口,并且每个进程都能接收到数据。
示例:
- 使用
SO_REUSEPORT
选项的示例:int sockfd; struct sockaddr_in servaddr; sockfd = socket(AF_INET, SOCK_STREAM, 0); int optval = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval)); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(8080); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(sockfd, 5);
大题
描述
牛牛从键盘输入一个长度为 n 的数组,问你能否用这个数组组成一个链表,并顺序输出链表每个节点的值。
输入描述:
第一行输入一个正整数 n ,表示数组的长度
输出描述:
制作一个链表然后输出这个链表的值
示例1
输入:4
5 4 2 1
输出:5 4 2 1
说明:请实现链表后再遍历输出结果!
答案:
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int value; // 节点值
struct Node* next; // 指向下一个节点的指针
} Node;
// 创建一个新的节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
fprintf(stderr, "Memory allocation failed.\n");
exit(EXIT_FAILURE);
}
newNode->value = value;
newNode->next = NULL;
return newNode;
}
// 将节点插入到链表尾部
void insertTail(Node** head, int value) {
Node* newNode = createNode(value);
if (*head == NULL) {
*head = newNode;
} else {
Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
// 遍历并打印链表
void printList(Node* head) {
Node* current = head;
while (current != NULL) {
printf("%d ", current->value);
current = current->next;
}
printf("\n");
}
// 释放链表内存
void freeList(Node* head) {
Node* current = head;
while (current != NULL) {
Node* temp = current;
current = current->next;
free(temp);
}
}
int main() {
int n;
printf("请输入数组长度 n: ");
scanf("%d", &n);
if (n <= 0) {
printf("数组长度必须大于0。\n");
return 1;
}
Node* head = NULL; // 初始化为空链表
printf("请输入 %d 个整数:\n", n);
for (int i = 0; i < n; ++i) {
int value;
scanf("%d", &value);
insertTail(&head, value);
}
// 输出链表
printList(head);
// 释放链表占用的内存
freeList(head);
return 0;
}