Linux进程管理测验

Linux进程管理测验

一、填空题
1、进程的属性保存在一个被称为进程控制块的结构体中,这个结构体中包括进程控制符、进程组、进程环境、进程的运行状态等。
2、进程在内存中可能会出现不同的状态,通常进程的状态被划分为五种:初始态、就绪态、运行态、睡眠态和终止态。
3、Linux系统中的进程结构类似树形结构,使用pstree命令可以查看当前系统中的进程树。进程树的顶端是进程init,它是系统启动后创建的第一个进程。
4、调用fork()函数成功创建子进程后,父进程中的fork()函数会返回子进程pid,子进程中的fork()函数会返回0。
5、若在程序中通过如下所示的循环创建进程,循环结束后,该进程会创建31个子进程。
for(int i=0;i<5;i++)
{
pid=fork();
}
二、判断题
1、进程是程序的一次执行过程。 (√)
2、exec函数族的功能是:根据指定的文件名或路径,找到可执行文件,用该文件取代调用该函数的进程中的程序,再从该文件的main()函数开始,执行文件的内容。 (√)
3、解决僵尸进程的方法是终止其父进程,使其变为孤儿进程。 (√)
4、fork()函数执行后,系统会立刻为子进程复制一份父进程的资源。 (×)
5、进程同步机制中的waitpid()函数和wait()函数用于使父进程阻塞等待子进程终止,将子进程进行回收,因此当父进程中调用了这两个函数时,就不会再有僵尸进程产生。 (×)
三、单选题
1、在程序中调用fork()函数创建进程,父子进程会获取不同的返回值,下面关于fork()函数的说法,错误的是。 ( B )
A、若子进程创建成功,父进程的fork()返回子进程pid,子进程的fork()返回0。
B、若子进程创建成功,子进程的fork()返回子进程pid,父进程的fork()返回0。
C、若子进程创建失败,父进程的fork()函数返回-1。
D、若子进程创建成功,子进程将从fork()函数调用处之后的代码开始执行。
2、下列哪种方法无法查看进程的信息。 ( C )
A、ps
B、top
C、kill
D、查看/proc目录
3、下列哪种方法可以等待接收进程号为pid的子进程的退出状态。 ( A )
A、waitpid(pid,&status,0)
B、waitpid(pid,&status,WNOHANG)
C、waitpid(-1,&status,0)
D、waitpid(-1,&status,WNOHANG)
4、函数waitpid()的返回值等于0时表示的含义是。 ( A )
A、等待的子进程已终止
B、终止的子进程不唯一
C、使用选项WNOHANG,且没有子进程退出
D、调用异常终止
5、从后台启动进程,应在命令的添加哪个符号? ( A )
A、&
B、#
C、*
D、~
四、简答题
1、简单说明程序和进程的区别。
答:(1)进程是动态的,程序是静态的。程序是一组有序的指令集合,是一个静态的概念;:进程则是程序及其数据在计算机上的一次执行,是一个动态的集合。离开了程序,进程就失去了存在的意义,但同一程序在计算机上的每次运行将构成不同的进程。
(2)一个进程可以执行多个程序。
(3)一个程序可被多个进程执行。
(4)程序可以长期保存,进程只能存在于一段时间。程序是永久存在的,而进程有从被创建到消亡的生命周期。
2、分析程序,写出程序的执行结果。
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid1,pid2;
if ((pid1 = fork()) == 0)
{
sleep(3);
printf(“child process_1\n”);
exit(0);
printf(“child process_1\n”);
}
else
{
if ((pid2 = fork()) == 0)
{
sleep(1);
printf(“child process_2\n”);
return 0;
}
else
{
wait(NULL);
wait(NULL);
printf(“info1 from parent process\n”);
printf(“info2 from parent process\n”);
return 0;
}
}
return 0;
}
结果:
child process_2
child process_1
info1 from parent process
info2 from parent process
五、编程题
1、编写程序,在程序中创建一个子进程,使父子进程分别打印不同的内容。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if (pid == -1)
{
perror(“fork error”);
exit(1);
}
else if (pid > 0)
{
printf(“parent process.”);
}
else if (pid == 0)
{
printf(“child process”);
}
return 0;
}
2、编写程序,在程序中创建一个子进程,使子进程通过exec更改代码段,执行cat命令。
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int ret = 0;
pid_t pid;
pid = fork();
if (pid == -1)
{
perror(“fork error”);
exit(1);
}
else if (pid > 0)
{
printf(“parent process.”);
}
else if (pid == 0)
{
printf(“child process.”);
ret=execlp(“cat”,“cat”,”-n",“test1.c”,NULL);
if(ret < 0)
{
printf(“execlp failed!\r\n”);
return 0;
}
}
return 0;
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值