选择
文件系统
-
(单选题)linux文件系统通常由四部分组成:引导块,超级块,索引节点和 ()。
A. 文件块
B. 数据块
C. 索引块
D. 目录块正确答案: B
-
(单选题)任何进程在运行时默认打开的三个流对象,都有相应的文件描述符,标准文件描述符定义标准输入设备的值为 。
A. 0
B. 1
C. 2
D. 3正确答案: A
-
(单选题)
系统调用的函数原型int open(const char *pathname, int flags),flag值中( )表示以读写的方式打开文件。A. O_RDONLY
B. O_WRONLY
C. O_RDWR
D. O_APPEND正确答案: C
-
(单选题)系统调用的函数原型int open(const char *pathname, int flags),flag值中( )表示若文件存在且为只读或只写成功打开,则将长度截为0。
A. O_APPEND
B. O_TRUNC
C. O_CREAT
D. O_EXCL正确答案: B
-
(单选题)此行代码length=lseek(fd,0,SEEK_END);中的length的值表示( )。
#include<stdio.h> #include<stdlib.h> #include<fcntl.h> #include<unistd.h> #include<string.h> int main(){ int fd,length; fd=open("lseek.txt",O_RDWR); length=lseek(fd,0,SEEK_END); printf("the length os lseek is %d\n",length); close(fd); return 0; }
A. 文件lseek.txt的大小
B. 调整lseek.txt指针位置到文件的开头
C. 调整lseek.txt指针位置到文件的中间
D. 调整lseek.txt指针位置到文件的第二个字节正确答案: A
-
(单选题)使用下列函数调用int fcntl(int fd, int cmd);来实现文件描述符的复制,cmd参数应使用哪一个?
A. F_DUPFD
B. FD_CLOEXEC
C. F_GETFD
D. F_SETFD正确答案: A
-
(单选题)阅读程序填空:如果想要获取文件的大小,空白处应该填写以下哪个答案。
#include<stdio.h> #include<unistd.h> #include<sys/stat.h> int main(int argc, char *argv[]){ struct stat statBuf; if(stat(argv[1],&statBuf)<0){ perror("stat"); } else{ printf("the size of file is %ld", ); } return 0; }
A. statBuf.st_size
B. statBuf.st_ino
C. statBuf.st_ctime
D. statBuf.st_atime正确答案:A
-
(单选题)在创建文件和目录时候,有默认权限。如果umask值为0022,则文件的默认权限为( ) 。
A. 0666
B. 0644
C. 0777
D. 0755正确答案: B
-
(单选题)执行程序,代码输出结果为( )。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> int main (void){ int fd; if((fd=open("tempfile",O_WRONLY|O_CREAT|O_TRUNC,0700))< 0){ perror("open"); exit(1); } if((link("tempfile","hardlink"))==-1){ perror("open"); exit(1); } struct stat statBuf; fstat(fd, &statBuf); printf("link num:%ld\n", statBuf.st_nlink); sleep(3); if(unlink("tempfile") < 0){ perror("unlink"); exit(1); } fstat(fd, &statBuf); printf("unlink ,num:%ld\n", statBuf.st_nlink); return 0; }
A.
link num:2
unlink ,num:1
B.
link num:2
unlink ,num:2
C
link num:3
unlink ,num:2
D.
link num:1
unlink ,num:1正确答案: A
-
(单选题)获取目录的系统调用函数为 ( )。
A. chdir()
B. getcwd()
C. opendir
D. closedir正确答案:B
进程
-
(单选题)一个进程是 ( )。
A. 处理机一次或多次执行的一个程序。
B. 一个独立的程序 +数据集。
C. PCB 结构与程序和数据的组合。
D. 一个独立的程序。正确答案: C
-
(单选题)一个进程调用 wait 或 waitpid 函数,可能产生 3 中情况,下列不属于这 3 种情况的是 ( )。
A. 如果所有子进程都还在运行,进程挂起。
B. 如果恰有子进程结束,它的终止状态字正等待父进程提取,立即得到该
终止状态字并返回,其返回值为该子进程的进程号。
C. waitpid,如果该进程没有子进程,参3指定了WNOHANG,返回0。
D. 如果该进程没有子进程,立即返回,返回值为 0。正确答案: D
-
(单选题)返回调用进程的进程标识号的系统函数是 ( )。
A. getpid
B. getpgrp
C. getppid
D. setpid正确答案: A
-
(单选题)程序和进程是两个不同的概念,以下不能描述这个观点的是( )。
A. 程序指出了处理器执行操作的步骤,而进程是一个程序在一个数据集合上
的一次执行。
B. 同一个程序运行 10 次,产生的是同一个进程。
C. 进程是动态的,是程序的执行过程。
D. 多个不同的进程可以包含相同的程序。正确答案: B
-
(单选题)Fork 函数在父进程中的返回值是 ( )。
A. 创建的子进程的进程标识号
B. 0
C. -1
D. 1正确答案: A
-
(单选题)在 Linux 中,下列不属于正常结束进程的方法是( )。
A. 在 main 函数中调用 return 。
B. 调用 exit 函数 。
C. 调用_exit 函数 。
D.调用 abort函数。正确答案: D
-
(单选题)以下程序的输出结果是( )
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> int main(int argc, char *argv[]){ printf("===================start of file\n"); pid_t pid = fork(); if (pid == -1) { perror("fork error"); exit(1); } else if (pid == 0) { printf("---child,my pid is %d,my parent pid is %d\n",getpid(),getppid()); } else if (pid > 0) { printf("---parent my child is %d,my pid is %d,myparent pid is %d\n", pid,getpid(),getppid()); sleep(1); } printf("===================end of file\n"); return 0; }
A
===================start of file
—parent my child is 4759,my pid is 4758,myparent pid is 3700
—child,my pid is 4759,my parent pid is 4758
===================end of file
B.
===================start of file
—parent my child is 4759,my pid is 4758,myparent pid is 3700
—child,my pid is 4759,my parent pid is 4758
===================end of file
===================end of file
C.
===================start of file
—parent my child is 4759,my pid is 4758,myparent pid is 3700
—child,my pid is 4759,my parent pid is 4758
===================end of file
===================end of file
===================end of file
D.
===================start of file
===================start of file
—parent my child is 4759,my pid is 4758,myparent pid is 3700
—child,my pid is 4759,my parent pid is 4758
===================end of file
===================end of file正确答案: B
-
(单选题)以下程序输出结果是( )
#include <stdio.h> #include <stdlib.h> #include <unistd.h> int var = 100; int main(void){ pid_t pid; pid = fork(); if (pid == -1) { perror("fork error"); exit(1); } else if (pid > 0) { var = 288; printf("parent, var = %d\n", var); sleep(1); } else if (pid == 0) { printf("child, var = %d\n", var); } printf("------------finish---------------\n"); return 0; }
A.
parent, var = 288
child, var = 100
------------finish---------------
B.
parent, var = 288
child, var =288
------------finish---------------
------------finish---------------
C.
parent, var = 288
child, var = 100
------------finish---------------
------------finish---------------
D.
parent, var = 288
child, var = 288
------------finish---------------
------------finish---------------正确答案: C
-
(单选题)以下程序输出结果是( )
int var = 100; int main(void){ int *p; pid_t pid; int fd; fd = open("temp", O_RDWR|O_CREAT|O_TRUNC, 0644); if(fd < 0){ perror("open error"); exit(1); } ftruncate(fd, 4); p = (int *)mmap(NULL, 4, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); if(p == MAP_FAILED){ perror("mmap error"); exit(1); } close(fd); pid = fork(); if(pid == 0){ *p = 7000; var = 1000; printf("child, *p = %d, var = %d\n", *p, var); } else { sleep(1); printf("parent, *p = %d, var = %d\n", *p, var); wait(NULL); int ret = munmap(p, 4); if (ret == -1) { perror("munmap error"); exit(1); } } return 0; }
A.
child, *p = 7000, var = 1000
parent, *p = 0, var = 100
B.
child, *p = 7000, var = 1000
parent, *p = 7000, var = 100
C.
child, *p = 7000, var = 1000
parent, *p = 7000, var = 1000
D.
child, *p = 7000, var = 1000
parent, *p = 0, var = 1000正确答案: A
-
(多选题)哪种进程之间的通信,数据不可以重复读( )
A. 共享内存映射进程间通信
B. fifo
C. 管道
D. 文件正确答案:BC
线程
-
下述是Linux下多线程编程常用的pthread库提供的函数名和意义,说法不正确的是:
A.pthread_create 创建一个线程
B.pthread_join用来等待一个线程的结束
C.pthread_mutex_init 初始化一个线程互斥锁
D.pthread_exit杀死一个线程正确答案: D
-
对线程函数来说,说法正确的是:
A、pthread_create中参数arg是传递给start_routine函数的参数
B、pthread_join函数用于结束线程,其参数是线程的返回值
C、 pthread_exit函数用于退出另一个线程,参数是另一个线程的ID
D、pthread_cancel函数用于取消当前线程的执行,即退出本线程正确答案:A
-
对互斥锁及条件变量说法不正确的是:
A、互斥锁保证让每个线程对共享资源按顺序进行原子操作
B、条件变量是让线程睡眠,在符合某种条件时唤醒睡眠的线程
C、条件变量可以让多个线程在某一时间上保持同步
D、在使用条件变量时,互斥锁会失去作用,所以是否有互斥锁关系不重要正确答案:D
-
以下说明正确的是:
A、进程和线程都可以由CPU直接执行的指令流,所以进程和线程没有区别
B、线程是一个独立的指令流,是在进程中被创建的,随进程的关闭而关闭
C、进程和线程都是一个程序,是执行程序的过程,拥有完整的资源,都有自己的数据段、代码段等
D、一个回调函数就是一个线程,所以多线程必须有多个回调函数实现正确答案: B
-
线程A SendMessage给线程B,线程B处理该消息时又SendMessage给线程A,会出现:
A、死锁
B、继承执行
C、线程A停止响应
D、线程B停止响应正确答案: B
填空
文件
- 获取目录的系统调用函数为 ( getcwd() )
- 函数调用int fcntl(int fd, int cmd);来实现文件描述符的复制,cmd参数应使用(
F_DUPFD
) - 命令行由(
shell
)函数提供 - 文件描述符的数据类型(
int
) - Linux下获取文件属性函数:(
stat()
) - 在创建文件和目录时候,有默认权限。
- 如果umask值为0022,则文件的默认权限为(0644)目录的默认权限为(0755)
- linux中把分区和目录对应的过程叫做(
挂载
) - gcc编译四个阶段:(
预处理、编译、汇编和链接
) - Linux操作系统内核由(
c语言和汇编语言
)编写完成。 - 目录(
/boot
)下存放linux操作系统启动时所要用到的程序 - Linux 系统的设备文件分为三类?(
字符设备文件、块设备文件和网络设备文件
) - vim三种模式:在命令模式下按下(
:(英文冒号)
)就进入了底线命令模式。 - Vim的三种模式:(
命令模式 插入模式 底行模式
) - 标准I/O提供了三种类型的缓冲,分别是 (
全缓冲 行缓冲 不带缓冲
) - 文件系统四部分 (
引导块,超级块,索引节点,数据区
) (超级块)用于存放文件的控制信息。 - (
fcntl
)系统调用可以根据文件描述符来操作文件特性。 - Valgrind包括很多工具,(
Memcheck
)是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,(Cachegrind
)是主要用来检查程序中缓存使用出现的问题。
Memcheck ------> 这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况
Callgrind ------> 它主要用来检查程序中函数调用过程中出现的问题。
Cachegrind ------> 它主要用来检查程序中缓存使用出现的问题。
Helgrind ------> 它主要用来检查多线程程序中出现的竞争问题。
Massif ------> 它主要用来检查程序中堆栈使用中出现的问题。
Extension ------> 可以利用core提供的功能,自己编写特定的内存调试工具 - 在标准IO库中,rewind函数作用?(将文件内部的位置指针重新指向一个流(
数据流/文件
)的开头) - lseek(fd,位移数,whence):设置文件偏移量
- length=lseek(fd,0,SEEK_END);中的
length
的值表示 (文件lseek.txt的大小
) - 文件描述符的数据类型:
int
- 文件创建目录: (
mkdir()
)
- getpid()获取子进程id
- getppid()获取父进程id
- getuid()获取用户id
- geteuid()获取有效用户id
- 更改目录:cd ;
- 查看当前所在的目录位置: pwd;
- 查看目录下的文件: ls;
- 修改文件权限:chmod;
- 查看进程:ps
- 移动指针lseek函数的参数:(
lseek(int fd ,_off_t offset , int whence)
) - linux文件系统通常由四部分组成:引导块,超级块,索引节点和 (数据块)
- 系统调用的函数原型int open(const char *pathname, int flags),flag值中(
O_TRUNC
)表示若文件存在且为只读或只写成功打开,则将长度截为0。 - 使用下列函数调用int fcntl(int fd, int cmd);来实现文件描述符的复制,cmd参数应使用哪一个?(
F_DUPFD
) - 使用 gdb 调试程序时,next 和 step 命令的作用?(
next:单步运行,不进入函数内部; setp:单步运行,进入函数内部
) - 进程运行时默认打开的标准对象:标准输入设备stdin、标准输出设备 stdout、标准错误 输出设备 stderr
- 修改文件权限命令:chmod、chgrp、chown。
- 文件描述符为?整型。对于用户空间来说,任何打开的文件都将分配一个唯一非负整数, 用于标识该打开文件,该值即文件描述符,为一个大于等于 0 的整数。
- 权限的值?读:4 写:2 执行:1 注意:前三位为用户的权限,再三位为所属组的权 限,再三位为其他用户的权限。
- 获取文件属性,是否穿透?stat 函数具有穿透能力,能够穿透链接文件;而 lstat 函数不 具有穿透能力,不穿透链接文件,文件类型还为链接文件。
opendir 函数:
打开一个目录,返回一个目录流指针。参数为欲打开目录的名称(路径)。
mkdir 函数:
第一个参数是欲创建的目录文件路径,第二个参数是创建目录的权限。- fcntl 函数:修改某个文件描述符的特殊属性
- 创建硬链接的系统调用:
link()
进程
- 返回调用进程的进程标识号(pid)的系统函数是(getpid)
- 一个进程是 (
PCB 结构与程序和数据的组合
) - 调用 (
abort函数
) 不属于正常结束进程的方法 - (
fifo 管道
)进程之间的通信,数据不可以重复读 - c语言中没有明确给定初值的全局变量和静态变量存放在 (
未初始化数据区
) - 修改文件权限命令:(
chmod
) -
- 向消息队列发送信号:msgsnd ()
- 接收队列的函数: msgrcv()
- 创建消息队列:msgget()
msgctl()
IPC_STAT 获取
IPC_SET 设置
IPC_RMID 删除
-
- shmget()函数用来创建共享内存
- shmat()函数 作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
- shmdt()函数用于将共享内存从当前进程中分离
- shmctl()函数用来控制共享内存
-
- getpid()获取子进程id
- getppid()获取父进程id
- getuid()获取用户id
- geteuid()获取有效用户id
- 查看进程的命令:
ps
- 信号是在软件层次上对(
中断
)机制的一种模拟, 是一种异步通信方式。 - 父进程等待子进程的结束,可以使用的函数是(
wait()
)和(waitpid()
) - linux主要有两个信号安装函数,分别是什么?
(signaction)、(signal)
- 一个完整的信号生命周期包含4个重要的事件,这4个重要事件分别是?(
信号诞生、信号在进程中注册、信号在进程中注销、信号处理函数执行完毕
) - 向消息队列发送消息的函数是(
msgsnd
) - 信号发送函数中, (
alarm
)和(setitimer()
)用于设置定时器,当计时时间到达时,向进程发送SIGALRM信号。 - c语言中没有明确给定初值的全局变量和静态变量存放在哪儿?(全局存储区(
静态存储区
)) - 函数geteuid()用于得到进程的? (
用户有效 UID 值
) - (
接到一个信号并终止
)属于异常终止一个进程 - linux中通过调用waitpid()函数得到进程的退出信息,该函数原型为pid_t waitpid(pid_t pid, int *status, int options);当第一个参数pid取值为-1时,表示(
等待任一子进程退出,相当于 wait()
) - Linux环境中使用kill函数向进程或进程组发送信号。Kill函数原型为
int kill(pid_t pid, int signo);当第一个参数pid>0时表示(发送信号给进程ID为pid的进程
)
- pid>0 将信号传给进程识别码为pid 的进程。
- pid=0 将信号传给和目前进程相同进程组的所有进程
- pid=-1 将信号广播传送给系统内所有的进程
- pid<0 将信号传给进程组识别码为pid绝对值的所有进程
-
修改消息队列状态信息的命令是(
msgctl()
) -
共享主存基本操作(
shmat()
)将共享主存区映射到进程虚拟地址空间 -
进程中不能忽略的两个信号?(
SIGSTOP和SIGKILL
) -
一个进程调用 wait 或 waitpid 函数,可能产生 3 种情况,下列不属于这 3 种情况的是 (
如果该进程没有子进程,立即返回,返回值为 0
) -
程序和进程是两个不同的概念,以下不能描述这个观点的是 (
同一个程序运行 10 次,产生的是同一个进程
) -
哪种进程之间的通信,数据不可以重复读(
fifo、 管道
) -
任何进程在运行时默认打开的三个流对象,都有相应的文件描述符,标准文件描述符定义标准输入设备的值为(
0
) -
进程初始化数据区:
全局初始化数据区/静态数据区
-
进程的堆区:用于动态内存分配。一般由程序员分配和释放,若程序员不释放,程序结束时由
OS
回收。 -
Linux 文件系统中的块有(根据块使用的不同):引导块、超级块、Inode 块、数据块。 控制信息、文件基本属性等是 Inode 节点,为文件系统索引。存放数据的为数据块。超级块中含有文件系统的基本信息,如块大小、指向空间 inode 和数据块的指针等相关信息。
线程
- pthread_exit (
终止线程
) -
- 线程的创建函数:pthread_create()
- 线程分离状态:.pthread_detach()
- 退出线程:pthread_exit()
- 取消线程:Pthread_cancel()
- 互斥锁的两种状态:(
上锁 解锁
) - 编译有线程的文件要加 (
-lpthread
)参数 - Linux 中采用“一对一”的线程机制,也就是一个用户线程对应一个(
内核线程
) - 当一个线程的属性设置为(
分离状态 detach
),该线程结束时立即释放它所占有的系统资源。 - (
pthread_key_create()
) 命令是创建线程私有数据 - 下述是Linux下多线程编程常用的pthread库提供的函数名和意义,说法不正确的是?(
pthread_exit杀死一个线程
) - 对线程函数来说,说法正确的是:(
pthread_create中参数arg是传递给start_routine函数的参数
) - 对互斥锁及条件变量说法不正确的是:(
在使用条件变量时,互斥锁会失去作用,所以是否有互斥锁关系不重要
) - 以下说明正确的是:(
线程是一个独立的指令流,是在进程中被创建的,随进程的关闭而关闭
) - 线程A SendMessage给线程B,线程B处理该消息时又SendMessage给线程A,会出现:(
继承执行
) - 读写锁:非阻塞的加锁解锁和阻塞的加锁解锁
- 堵塞的方式申请读锁:pthread_rwlock_rdlock()
非堵塞的方式申请读锁:pthread_rwlock_tryrdlock()
堵塞方式申请写锁:pthread_rwlock_wrlock()
非堵塞方式申请写锁:pthread_rwlock_trywrlock() - 互斥锁的上锁函数是 pthread_mutex_lock()
非阻塞加 try; 解锁函数是 pthread_mutex_unlock()。
网络
- (
套接字
)通信方式适用于不同机器之间的进程通信 - UDP,TCP属于(
传输层
)协议。 面向连接
的编程:TCP;面向无连接
的是:UDP- 在不同主机间进行通讯的是:
scoket 或者是套接字
- 三次握手:
连接建立、数据传输、连接释放
。 创建套接字的函数 scoket()
- 监听网络函数:listen()
发起连接函数:connect()
接受连接函数:accept()
读写 scoket 对象:read()/write()
TCP 发送和接受数据:send()/recv()
关闭 scoket 对象:close()