进程与线程测试题

  • 选择题(40分)

1. 如果键盘输入为abcdef,程序如下所示,打印结果应该是( c )

   char  buffer[6];

   ……

   fgets(buffer, 6, stdin);

   printf(“%s”, buffer);

   [A]  abcde       [B] abcdef     [C] abcdef 后出现乱码     [D]  段错误

2. fread()返回值的含义是 ( B )

[A] 读取的字节数    [B] 读取的对象数    [C] 缓冲区的首地址   [D] 随机数

3. 如果umask的值为022,创建文件时指定的权限是775,则该文件的实际权限为 ( A )

   [A] 755        [B] 722       [C] 753       [D] 022

4. 用open( )创建新文件时,若该文件存在则可以返回错误信息的参数是 ( B )

[A] O_CREAT     [B] O_EXCL      [C] O_TRUNC       [D] O_NOCTTY

5. 下列哪个函数不会改变文件读写位置( D )

    [A] fread      [B] fwrite     [C] rewind     [D]  ftell

6. lseek()操作成功时返回值的含义是 ( B )

    [A] 新的文件位移量            [B] 文件位置指针移动的字节数  

    [C] 原先的文件位移量          [D]  总是0

7. 如果要删除一个文件需要哪种权限 ( A )

    [A] 对文件具有写权限           [B] 对文件具有可执行的权限  

[C] 对目录具有写权限           [D] 对目录具有可执行的权限

8. 下列不是用户进程的组成部分的是(  D )

[A] 正文段        [B] 用户数据段        [C] 系统数据段        [D]  elf段

9.  以下哪种不是进程的类型 ( B )

   [A]  批处理进程       [B] 管理进程     [C] 交互进程      [D]  守护进程

10. 以下哪种方法无法查看进程的信息 ( C )

   [A] ps         [B] 查看/proc目录         [C] kill          [D] top

11. 可以改变正在运行的进程优先级的命令是(A  )

   [A] nice       [B] renice       [C] kill       [D]  set  

12. 以下哪种用法可以等待接收进程号为pid的子进程的退出状态 (  A )

 [A]  waitpid(pid, &status, 0)         [B]  waitpid(pid, &status, WNOHANG)

  [C]  waitpid(-1, &status, 0)          [D]  waitpid(-1, &status, WNOHANG)

13. 函数waitpid的返回值等于0时表示的含义是 ( B )

   [A] 等待的子进程退出    [B] 使用选项WNOHANG且没有子进程退出

   [C] 调用出错            [D] 不确定

14. 下列对无名管道描述错误的是 ( D )

   [A] 半双工的通信模式,通常当单工使用        

[B] 有固定的读端和写端

[C] 可以使用lseek函数

[D] 只存在于内存中  

15. 下列对于有名管道描述错误的是 ( D )

[A] 可以用于互不相关的进程间     

[B] 通过路径名来打开有名管道

[C] 在文件系统中可见

 [D] 管道内容保存在磁盘上

16. 下列不属于用户进程对信号的响应方式的是 ( B )

 [A] 忽略信号      [B] 保存信号       [C] 捕捉信号       [D] 按缺省方式处理

17. 不能被用户进程屏蔽的信号是 ( B)

    [A] SIGINT        [B] SIGSTOP        [C] SIGQUIT         [D] SIGILL

    

18. 默认情况下,不会终止进程的信号是 ( D )

    [A] SIGINT        [B] SIGKILL         [C] SIGALRM        [D]  SIGCHLD

19 下列不属于IPC对象的是 ( A )

    

    [A] 管道        [B] 共享内存       [C] 消息队列         [D]  信号灯

20. 下列哪种机制只能用于线程之间的同步 ( D )

    [A]  信号                     [B]  IPC信号灯  

    [C]  POSIX有名信号量         [D]  POSIX无名信号量

  • 判断题(15分)
  1. open()可以用于创建普通文件和设备文件 ( X )
  2. lseek()并不引起IO操作 ( V )
  3. fgetc()的返回值是char型(X)
  4. 文件描述符是系统随机分配的非负整数 ( X )
  5. 某些库函数的实现不需要系统调用 ( V)    
  6. Linux下进程的模式分为用户态,内核态和系统态 (X )
  7. 每个进程的进程号和父进程号在进程执行期间不会改变 ( V )
  8. 子进程被创建后从fork()的下一条语句开始执行 ( V )
  9. 执行_exit()函数时不会清理IO缓冲 (X )
  10. exec函数族可以创建一个新的进程来执行指定的程序 ( X )
  11. wait函数无法接收子进程退出的状态 ( X )
  12. 无名管道只能用于父子进程 ( V)
  13. 可以用signal()向指定的进程发信号 ( V )
  14. 消息队列可以按照消息类型读取消息 ( V )
  15. 共享内存是一种最为高效的进程间通信方式 ( V )

  • 简答题(25分)

    1. 文件IO和标准IO有什么区别?(5分)
  1. 标准io是用户调用库函数操作字符流文件io是系统调用操作文件描述符。
  2. 1)标准io分:全缓存:当填满标准IO缓存后才进行实际的IO操作。 (2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。 (3)不带缓存:stderr就是了文件io:不带缓存。
  3. 标准io采用默认的缓冲机制,生成一个包含有文件的读或写的缓冲区,而文件io则是在内核下系统生成缓冲区。
    1. 如何判断一个文本文件包含多少行(写出代码, 5分)

#include<stdio.h>

#include<string.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<sys/types.h>

int main()

{

int op,i;

int fd,num=0;

fd=open(“文件”,O_CREAT|O_RDONLY|,0666);

if(-1==fd)

{

perror(“open fail”);

return -1;

}

char buf[20]={0};

op=read(fd,buf,20);

if(op<0)

{

perror(“read fail”);

return -1;

}

while(fd>0)

{

for(i=0;i<20;i++)

{

if(buf[i]==’\n’)

{

num+=1;

}

}

memset(buf,’\0’,20);

}

printf(“%d”,num);

close(fd);

}

    1. 请描述进程和程序的区别 (4分)

进程是一个程序的一次执行过程,是程序执行和资源管理的最小单位是一个动态的;程序是静止的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念。

    1. 指出静态库和共享库的区别(使用方法,对程序的影响) (5分)

静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要静态库,因此体积较大。

动态库在程序编译时并不会被链接到代码中,而是在程序运行时才被载入,因此在程序运行时还需要动态库的存在,因此代码体积较小。

    1. 写出设置信号处理函数的原型 (3分)

void(*signal(int signum,void (*handler)(int)))(int);

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum,sighandler_t handler);

void driver_handler(int signo);

    1. 程序代码如下,请按执行顺序写出输出结果 (3分)

int main()

{  pid_t  pid1,pid2;

   if((pid1=fork()) = = 0)

{

   sleep(3);

   printf(“info1 from child process_1\n”);

   exit(0);   

   printf(“info2 from child process_1\n”);

}

else

{

  if((pid2=fork()) = = 0)

  {

     sleep(1);

     printf(“info1 from child process_2\n”);

     exit(0);

  }

  else

  {

     wait(NULL);

     wait(NULL);

     printf(“info1 from parent process\n”);

     printf(“info2 from parent process”);

     _exit(0);

  }

}  

info2 from child process_1

info2 from child process_1

info1 from child process_2

info2 from child process_1

info1 from child process_1

info2 from child process_1

info1 from parent process

info2 from parent process

  • 问答题(20分)
    1. 用文件IO分别实现标准IO中的(r, r+, w, w+, a, a+),文件名由argv[1]传入程序.

  (O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC, O_APPEND) 

Int open(const char * pathname,int flags,int perms);

r: open (argv[1],O_RDONLY);

r+: open (argv[1],O_RDWR);

w: open (argv[1],O_WRONLY|O_CREAT|O_TRUNC,0666);

w+: open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0666);

a: open(argv[1],O_WRONLY|O_CREAT|O_APPEND,0666);

a+: open(argv[1],O_RDWR|O_CREAT|O_APPEND,0666);

    1. 指出创建守护进程的步骤(6分)

  1. 创建子进程,父进程退出 fork(),exit();
  2. 子进程中创建新会话     setsid();
  3. 改变当前目录为根目录   chdir();
  4. 重设文件权限掩码       umsk(0);
  5. 关闭文件描述符         close();
    1. 请画出Linux中进程的状态切换图(6分)

 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值