Linux复习(成熟期版)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前面的可能考选择题,填空题,全部题型如下:
一、选择题(10个题,每题2分,共20分)
二、填空题(10个空,每空2分,共20分)
三、程序阅读题(2道题,共20分)
四、程序注释(1道题,共20分)可能考I/O
五、编程题(1道题,共20分)
P 154 文件I/O操作open()、read()、write()、lseek()和close()
仔细阅读程序,能写注释或填空。
/* copy_file.c */
#include
#include
#include
#include
#include
#include
#define BUFFER_SIZE 1024/* 每次读写缓存大小1KB,关于《linux读写文件运行效率》的传送门*/
#define SRC_FILE_NAME "src_file" /* 源文件名,之后用SRC_FILE_NAME代替src_file */
#define DEST_FILE_NAME "dest_file" /* 目标文件名文件名,之后用DEST_FILE_NAME代替dest_file */ #define OFFSET 10240/* 复制的数据大小 1MB,也是lseek函数的偏移量*/
int main()
{
int src_file, dest_file; //定义了2个变量
unsigned char buff[BUFFER_SIZE]; //设定缓存的大小,定义为数组,存放读写缓存
int real_read_len;
/* 以只读方式打开源文件 */
src_file = open(SRC_FILE_NAME, O_RDONLY); //前面的src_file是变量名,成功时为3,失败时为-1 //也可以写成src_file = open("src_file", O_RDONLY);
/* 以只写方式打开目标文件,若此文件不存在则创建该文件, 访问权限值为644 */
dest_file = open(DEST_FILE_NAME, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
//前面的dest_file是变量名,成功时为4,失败时为-1
//也可以写成 d est_file = open("dest_file",O_WRONLY|O_CREAT,644);
if (src_file < 0 || dest_file < 0) //打开文件失败时
{
printf("Open file error\n"); //输出这句话
exit(1); // exit()中,1是返回给操作系统的,0是正常退出
}
/* 将源文件的读写指针移到最后10KB的起始位置*/
lseek(src_file, -OFFSET, SEEK_END); //从文件的结尾处向前移动10KB
// OFFSET 是偏移量,正值向前移,负值向后移。这里在 OFFSET 前加了负号。
// SEEK_END 表示从文件的结尾开始。
//也可以写成lseek("src_file", -10240, SEEK_END);
/* 读取源文件的最后10KB数据并写到目标文件中,每次读写1KB */
while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)//读取成功时返回读到的字节数//红字部分也可以写成 read("src_file", buff, 1024)
{
write(dest_file, buff, real_read_len);
// real_read_len 在上一步被赋值为 1KB,即real_read_len = 1024;
//也可以写成write("src_file", buff, 1024)
close(dest_file); //关闭文件,这里等同于close(4);
close(src_file); //关闭文件,这里等同于close(3);
return 0; //main函数里,return 0 就是关闭程序。子程序里 return 为返回值。
}
P 214 子进程和父进程wait()和waitpid() 仔细阅读程序,能写注释或填空,写出输出结果。
wait()函数是用于使父进程阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。
如果该父进程没有子进程或者他的子进程已经结束,则wait()就会立即返回。
本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG 使该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔一秒循环判断一次。
该程序源代码如下所示:
/* waitpid.c */
#include
#include
#include
#include
#include
int main()
{
pid_t pc, pr;
pc = fork(); //使用fork()函数,创建了一个子进程,在子进程里pc = 0,在父进程里pc = 子进程的进程号。
//子进程和父进程是并行运行的,即同时运行。
//注意:是创建了一个子进程,不是一个子程序,也不是一个新程序。程序只有一个。
if (pc < 0)
{
printf("Error fork\n");