Linux编程考前测试题

选择题

1:当打开vi文本编辑器编辑文件时,vi处于(A)模式
A: 命令模式
B: 编辑模式
C: 实模式
D: 虚模式

2:下列有关fork()函数返回值说法错误的是(D)
A: 函数城公安返回时,一次返回两个值,错误时返回-1
B: 返回值等于0表示子进程
C: 返回值大于0表示父进程
D: 大于0的返回值为父进程的PID

3:下列进程间通信方式中能实现不同计算机间进程通信的方式是 (C)
A: 管道
B: 消息队列
C: 套接字
D: 共享内存

4:当打开vi文本编辑器编辑文件时,vi处于( A )模式。
A命令模式 B编辑模式
C 实模式 D虚模式

5:下列有关fork( )函数返回值说法错误的是( D )。
A: 函数返回时,一次返回两个值,错误时返回-1
B: 返回值等于0表示子进程
C: 返回值大于0表示父进程
D: 大于0的返回值为父进程的PID

6:下列进程间通信方式中能实现不同计算机间进程通信的方式是 (C) 。
A: 管道 B: 消息队列
C: 套接字 D: 共享内存

7:Valgrind包括很多工具,__C__是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。
A. Callgrind B. Cachegrind
C.Memcheck D. Helgrind

8:dup()系统调用的功能是__B__
A. 调节读写的偏移量 B. 复制文件描述符
C. 关闭文件描述符 D. 根据文件的描述符来操作文件特

9:chmod()系统调用的作用是__B_
A.获取文件属性 B.修改文件权限
C. 获取文件存取权限 D. 设置文件存取权限屏蔽字

10:下列__B__系统调用可以更改目录?
A. mkdir() B. chdir()
C. opendir() D. readdir()

11:条件变量不能和互斥锁结合使用。( B )
A: 是 B: 否

12 . ____D__是Linux的创始人。
A. Turbolinux B. AT&T Bell Laboratry
C. University of Helsinki D. Linus Torvalds

13.在Linux中,完整路径中的目录间分隔符是__A____。
A. / B. \ C. | D. -

14 . 在Linux中,如果当前目录是/root/aaa/china,则下面____B__是china目录的父目录。
A. /root/ B. /root/aaa C. / D. /aaa

15 . 下面___A___可被用来关闭Linux系统。
A. init 0 B. init 1 C. init 5 D. init 6

16 . 在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是___D___。
A. -m B. –d C. -f D. –p
17 . 更改一个文件权限的命令是____C__。
A. change B. attrib C. chmod D. at

18 . Linux的每类用户拥有三种权限,其中不包含的权限是___D___。
A. r B. w C. x D. m

19 .下面___D___表示不管cmd1是否执行成功,都要执行cmd2命令。
A. cmd1;cmd2 B. cmd1|cmd2 C. cmd1&&cmd2 D. cmd1||cmd2

20 . 使用cd ~ 命令后,我们会进入___A___目录。
A. 用户的主目录 B. / C. ~ D. /tmp

21 . 用ls –l 命令列出下面的文件列表,__C____文件是目录。
A. -rw-rw-rw- 2 hel-s users 56 Sep 09 11:05 hello
B. -rwxrwxrwx 2 hel-s users 56 Sep 09 11:05 goodbey
C. drwxr–r-- 1 hel users 1024 Sep 10 08:10 zhang
D. lrwxr–r-- 1 hel users 2024 Sep 12 08:12 cheng

22 . 在Linux系统中,硬件设备大部分是安装在____D__目录下的。
A. /mnt B. /swap C. /proc D. /dev

23 . 按____B__键能中止当前运行的命令。
A. Ctrl –D B. Ctrl –C C. Ctrl –B D. Ctrl -F

24 . 下面对Linux命令的描述__C____是正确的。
A. 不是大小写敏感的 B. 都是大写的
C. 大小写敏感 D. 都是小写

25 . 为了保证系统的安全,现在的linux系统一般将/etc/passwd密码文件加密后,保存为____D__文件。
A. /etc/group B. /etc/netgroup C. /etc/libsafe.notify D. /etc/shadow

26 . 我们将逻辑分区建立在___D___分区上。
A. 从分区 B. 第二分区 C. 主分区 D. 扩展分区

27 . 我们一般使用____B__工具来对硬盘建立分区
A. mknod B. fdisk C. format D.mkfs

28 . 在vi中强制退出不保存的命令是____D__。
A. :q B. :w C. :wq D. :q!

29 . 在vi编辑器中的命令模式下,撤销上一次对文本的操作,可使用__C____令。
A. 上箭头 B. 下箭头 C. u D. *

30 . 在Linux系统中的脚本文件一般以_B_____开头。
A. $/bin/sh B. #!/bin/bash C. use /bin/sh D. shell=/bin/sh

31 . 在添加用户的时候可以使用____A__参数来指定用户的用户主目录。
A. -d B. -s C. -c D. –g

32 . 关于swap分区,下面__D____的叙述是正确的。
 A. 用于存储备份数据的分区
B. 用于存储内存出错信息的分区
C. 在Linux引导时用于装载内核的分区
D. 作为虚拟内存的一个分区

33 . 在Linux中,系统管理员(root)状态下的提示符是___B___。
A. $ B. # C. % D. >

34 . 下面___C___参数可以删除一个用户并同时删除用户的主目录。
A. rmuser -r B. deluser -r C. userdel –r D. usermgr –r

35 . 下面____D__命令可被用来重启Linux系统。
A. init 0 B. init 1 C. init 5 D. init 6

36 . 显示一个文件最后几行的命令是___B___。
A. tac B. tail C. rear D. last

37 . With a Linux 2.2 Kernel-based machine configuration of 133 MHZ, 32 MB RAM and a 1 GB HD, how much swap should be configured? D
A. 512MB B. 256MB C. 128MB D. 64MB

38 . Which command removes all subdirectories in /tmp, regardless of whether they are non-existent or in use? D
A. del /tmp/* B. rm -rf /tmp C. rm -Ra /tmp/* D. rm -rf /tmp/*

39 . Your unmask is set to 002. If you create a new file, what will the permission of the new file be? A
A. –rw-rw-r-- B. rwxrwx-w- C. ------w- D. rwxrwxr-x

40 . Linux is a(n) A_ operating system, meaning the source code is freely available.
A. Open sourced B. User licensed C. Closed source D. Open binary

41 . What command can be used to shutdown the computer? A
A. shutdown B. close C. init 3 D. delete
42 .将当前目录下的压缩归档文件myfile.tar.gz解压至/tmp下,应该用( A )
A.tar –zxvf myfile.tar.gz –C /tmp
B.tar –zxvf myfile.tar.gz –c /tmp
C.tar –jxvf myfile.tar.gz –C /tmp
D.tar –zxvf myfile.tar.gz –d /tmp

43 .对名为passwd的文件用chmod 743对权限进行了修改,那么passwd文件现在的权限是( C )
A.rwxr-xr–
B.rw-r–r--
C.rwxr—wx
D.rwxr-x-wx

44 .如果想给脚本编辑器加入行号显示应该编辑( D )文件
A./etc/.bashrc
B./etc/.vimrc
C./etc/bashrc
D./etc/vimrc

45 . linux操作系统关机可使用的命令是(C )
A.reboot
B.init 6
C.init 0
D.shutdown –r now
45 . 所有用户登录的缺省配置文件是( B )
A./etc/profile
B./etc/login.defs
C./etc/.login
D./etc/passwd

多选题

1.以下哪几种是vim的工作模式( ABD ) (多选)
A.命令行模式
B.编辑模式
C.删除模式
D.底行模式

2 . 关于硬链接的描述正确的 ( BE )
A.跨文件系统
B.不可以跨文件系统
C.为链接文件创建新的i节点
D.可以做目录的连接
E.链接文件的i节点同被链接文件的i节点

3 .在shell编程中关于$2的描述正确的是 ( CE )
A.程序后携带了两个位置参数
B.宏替换
C.程序后面携带的第二个位置参数
D.携带位置参数的个数
E.用$2引用第二个位置参数

4 .关于sed描述正确的是 ( ABD )
A.sed 是Linux系统中的流编辑器
B.sed 是UNIX系统中的流编辑器
C.sed 网络文件系统的类型
D.利用管道对标准输入/标准输入的数据进行编辑和组合
E.sed是NFS的应用程序

5 . 关于限制磁盘限额,描述正确的是(ABD )
A.使用edquota可以监控系统所有用户使用的磁盘空间,并在接近极限时提示用户
B.用户组的磁盘限额是用户组内所有用户予设磁盘空间总和
C.单个用户的磁盘限额就是该用户所在用户组内所有磁盘限额的总合
D.在Linux系统下限制用户使用的磁盘空间可以使用edquota
E.用户组的磁盘限额就是该用户组内拥有最大磁盘限额值的用户的磁盘限额

判断题

1 . 用户zhangsan使用su命令变更到lisi用户时,需要输入lisi用户的口令。( T )

2 . 为了能让其它用户使用cd命令进入该目录,需要设置读权限。( F )

3 . linux系统给每个进程分配唯一的进程ID,用户在进程存在期间用进程ID标识一个进程。( T )

4 . 普通用户也可以增加进程的优先级。( F )

5 ./分区越大约好,因为/越大,Linux启动速度越快。( F )

6 . 环境变量不会因为shell的改变而丢失。( F )

7 . 如果使用ln命令将生成了一个指向文件file的硬链接file1,如果你将文件file删除,还能够访问file1。( F )

8 . 某些变量在一开始执行脚本时就被设定且不再改变,它们被称为本地变量。( T )

9 . 将字符串放在一对双引号之间,则双引号内的所有字符的特殊含义都被忽略。( F )

10 . 输入重定向是指把命令的标准输入重定向到指定的文件中。( T )

填空题

1:用GCC编译过程可以被细分为四个阶段:预处理、编译、汇编和 连接

2:编译有线程的文件要加 -lpthread 参数

3:父进程等待子进程的结束,可以使用的函数是 wait() waitpid()
4:__ mkdir __命令用来创建目录。

5:vim三种模式:分别是命令模式,输入模式和底线命令模式。在命令模式下按下__:__就进入了底线命令模式。

6:用GCC编译过程可以被细分为四个阶段:预处理、编译、汇编和 连接
7:编译有线程的文件要加 -lpthread 参数。

8:父进程等待子进程的结束,可以使用的函数是 wait() 和 waitpid() 。
9:创建线程的函数是 pthread_create()

10:初始化互斥锁的宏是 PTHREAD_MUTEX_INIT ;
初始化条件变量的宏是 PTHREAD_COND_INIT
初始化读写锁的宏是 PTHREAD_RWLOCK_INITIALIZER

11.标准I/O提供了三种类型的缓冲,分别是全缓冲、__ 行缓冲 __和不带缓冲。

12 . vi编辑器具有三种工作模式:命令模式、文本输入模式 和末行模式。

13 . 唯一标识每一个用户的是用户______UID____ 。

14 . 某文件的权限为:lrw- r-- r-,用数值形式表示该权限,则该八进制数为:0644__,该文件属性是____连接文件______。

15 . 安装Linux系统对硬盘分区时,必须有两种分区:__根分区(/)交换分区(swap)__。

16 . 将前一个命令的标准输出作为后一个命令的标准输入,称之为____管道______。

17 . 为脚本程序file文件所有者增加执行权的命令及参数是_ chmod 100 file_____________。

18 . 在常用的shell预定义变量中,______$?_____是命令执行后返回的状态。

19 . 显示Linux系统中正在运行的全部进程,应使用的命令及参数是___ps –a______。

20 . 在Linux系统中,权限最高的是______root_____用户。

21 . 在shell编程中, if的结束标志是_______fi____。

22 . “init”命令是所有进程的祖先,它的进程号始终为______1_____。

23 . 设当前目录下有以下文件:
① a ② a.exe ③ b ④ b.txt ⑤ abc ⑥ abc.exe
⑦ c.txt ⑧ ba ⑨ ac ⑩ bc.txt ⑾ a.xy ⑿ca.yz
请使用通配符将下列信息表示出来。

A: ②,⑥,⑾            ______ a???*_____________
B: ④,⑦,⑩             ________*.txt___________
C: ⑾,⑿             _________*.[xy][yz]__________
D: ⑧,⑨              ________[ab][ac]___________
E: ②,④,⑥,⑦,⑩        ______*.???_____________

23.chown命令的作用是 改变文件或文件夹所属用户
24.安装桌面linux最少需要两个分区,分别是 SWAP、/ 。
25.用于复制文件的命令是 cp ,用于复制目录的命令是 cp -r
26.swap分区如果分配过大会带来 浪费硬盘空间、频繁死机问题
27.使用rpm可以很容易对rpm形式的软件包进行安装升级和 查询、卸载 及校验等操作。

简答题

1.请详细说明什么是shell,以及它的作用。
shell就是命令解释器,它提供了用户与操作系统之间基于命令行的交互界面,(2分)用户命令行输入命令,由shell对它们进行解释,并将其送往操作系统执行。(3分)
2.按下列要求请你写出步骤完成题目(注意请把命令格式写完整) (10分)
A.建立组hello
B.建立用户Bill,该用户属于hello组
C.设置Bill密码为123
D.建立一个新的组bye
E.把Bill改到新建的bye组中

  1. groupadd hello (1分)
  2. useradd -d /home/Bill –g hello -s /bin/bash Bill(1分)
  3. passwd Bill 输入123回车 再次输入123回车(1分)
  4. groupadd bye(1分)
  5. usermod -g bye Bill(1分)

3.请简述进程与线程的区别。

1.进程有自己独立的地址空间;而线程共享进程的地址空间;
2.一个程序至少有一个进程,一个进程至少有一个线程;
3.线程是处理器调度的基本单位,但进程不是;
4.二者均可并发执行
5.多线程比多进程成本低,但性能更低。

4 .现有一个文件夹book,需要你归档压缩为book.tar.bz2的文件,请写出压缩及解压的步骤。

1)tar -jcvf book.tar.bz2 book(3分)
2)tar -jxvf book.tar.bz2(2分)

5 .请你简述常见的三种磁盘阵列的名称,优点及为什么会具有此种优点。

Raid 0
又叫磁盘分条,需要大于等于2块磁盘完成,速度最快,没有容错功能,因为数据是分成奇数条和偶数条分条同时在两个硬盘中同时写入,所以速度最快,磁盘空间利用率100%。(2分)

Raid 1 镜像卷 ,两块硬盘实现,速度不快,有容错功能,空间利用率50%。因为把相同的数据写入了2遍所以有容错功能。(2分)

Raid5 大于等于3块硬盘实现,有容错功能,速度较快。磁盘空间利用率(n-1)/n.因为三块磁盘,其中2块磁盘在做raid 0,剩下的一块硬盘是校验。(1分)

6 .请简述主分区、扩展分区、逻辑分区的关系。 (注意语言准确性)

一块硬盘中刨除主分区以外剩余所有的空间都是扩展分区,所有的逻辑分区之和组成扩展分区。(1分)
linux中1-4是预留给主分区和扩展分区的,主分区至少要有1个,之多可以有4个,扩展分区至多只能有1个或者没有,但是主分区加上扩张分区数量不能超过4个。(2分)
扩展分区下必须再分逻辑分区,不然空间不能被格式化,逻辑分区的数量没有限制。(2分)

编程题

1:编写两个线程,其中一个线程接收用户输入,一个线程输出用户输入的数据,要求用线程同步方法进行处理,不能采用类似sleep(x)的等待语句,不能影响程序的执行效率

#include"stdio.h"
#include"pthread.h"
#include"semaphore.h" 

static char datbuf[105] ;
static int n;
sem_t sem1,sem2;

void *do_input(void *pvoid)
{
    
    
    int i;
    sem_wait(&sem1); 
    printf("please input data\n");
    scanf("%s",datbuf);
    sem_post(&sem2);
    pthread_exit(NULL);
    
}

void *do_show(void *pvoid)
{
    
    
  int i;
  sem_wait(&sem2);
  printf("output data:\n");

    printf("%s",datbuf);
  sem_post(&sem1);
  pthread_exit(NULL);
}

int main()
{
    
    
  pthread_t tid1,tid2;
  int ret;
  
  ret = sem_init(&sem1,0,1);
  ret += sem_init(&sem2,0,0);
  if(ret != 0)
  {
    
    
     printf("Any semaphore inittialization failed\n");
     return ret;
  }
  
  pthread_create(&tid1,NULL,&do_input,NULL);
  pthread_create(&tid2,NULL,&do_show,NULL);
  
  pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);
  return 0;
}

2:请编写一个简单的基于TCP的服务器、客户端模拟系统。该模拟系统中服务器端一直监听本机的6666号端口,如果收到连接请求,将接收请求并接收客户端发来的消息;客户端与服务器端建立连接并发送一条消息。

在终端在tcp_server.c 编写服务端代码
在终端在tcp_client.c 编写客户端代码
代码如下:
tcp_server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char *argv[])
{
    
    
    int serv_sock;
    int clnt_sock;

    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    socklen_t clnt_addr_size;

    char message[]="Hello World!";

    if(argc!=2){
    
    
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    serv_sock=socket(PF_INET, SOCK_STREAM, 0);
    if(serv_sock == -1)
        error_handling("socket() error");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(atoi(argv[1]));

    if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1)
        error_handling("bind() error"); 

    if(listen(serv_sock, 5)==-1)
        error_handling("listen() error");

    clnt_addr_size=sizeof(clnt_addr);  
    clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size);
    if(clnt_sock==-1)
        error_handling("accept() error");  

    write(clnt_sock, message, sizeof(message));
    close(clnt_sock);
    close(serv_sock);
    return 0;
}

void error_handling(char *message)
{
    
    
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

tcp_client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char* argv[])
{
    
    
    int sock;
    struct sockaddr_in serv_addr;
    char message[30];
    int str_len=0;
    int idx=0, read_len=0;

    if(argc!=3){
    
    
        printf("Usage : %s <IP> <port>\n", argv[0]);
        exit(1);
    }

    sock=socket(PF_INET, SOCK_STREAM, 0);
    if(sock == -1)
        error_handling("socket() error");

    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
    serv_addr.sin_port=htons(atoi(argv[2]));

    if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) 
        error_handling("connect() error!");

    while(read_len=read(sock, &message[idx++], 1))
    {
    
    
        if(read_len==-1)
            error_handling("read() error!");

        str_len+=read_len;
    }

    printf("Message from server: %s \n", message);
    printf("Function read call count: %d \n", str_len);
    close(sock);
    return 0;
}

void error_handling(char *message)
{
    
    
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

设置服务端口号为6666
在这里插入图片描述
再打开一个终端作为客户端接收信息
在这里插入图片描述
3. 编写shell程序,
(1)使用for循环计算100以内所有奇数的和。

#! /bin/bash
#定义变量,并赋初值为0
sum=0;                                         (2分)
#for循环开始,设置起始数值为1,结束数值为100,步长为2
for i in {
    
    1..100..2}                           (3分)
do                                             (1分)
  #将数累加
     let "sum+=i"                                (1分)
done
echo "the sum is $sum"                         (1分)

(2)使用while循环计算100以内所有偶数的和。

 #! /bin/bash
 #定义初始化变量
 SUM=0                                             (1分)
 i=0                                               (1分)
 # 开始while循环
 while [[ "$i" -le 100  ]]                         (2分) 
   do                                                (1分)
      SUM=$(( $SUM + i ))                            (1分)
     i=$((i+2))                                     (1分)
 done
 echo $SUM

4.编写一个shell程序,统计出linux系统内
(1)所有用户使用的shell,及各种shell使用的次数,
(2)按照使用次数升序排一次。
(3)按照使用次数降序排一次。

cut -d’:’-f7 /etc/passwd |sort |uniq –c       (8分)   统计出passwd中各种shell的使用次数
cut -d: -f7 /etc/passwd|sort|uniq -c|sort -n      (6分)  统计出passwd中各种shell的使用次数,升序排序
cut -d: -f7 /etc/passwd|sort|uniq -c|sort -n|tac  (6分)   统计出passwd中各种shell的使用次数,升序排序

猜你喜欢

转载自blog.csdn.net/qq_43573663/article/details/109308041