Linux系统编程复习

第一章:操作系统基本知识

1.根目录下各个目录的详细介绍

/bin:二进制程序
/boot:启动配置文件
/dev:设备文件 包含设备文件 终端设备,usb或连接到系统的任何设备
/etc:配置文件
/home:用户家目录
/lib:系统库文件
/media:挂载可移动设备的临时目录
/mnt:挂载文件系统
/opt:提供一个可供选的应用
/proc:特殊的动态目录,不同时间下,里面的内容不一样
/root:root用户主目录
/sbin:重要的系统二进制文件,通常由系统管理员使用
/sys:系统文件
/tmp:临时文件
/usr:绝大多数用户能访问的应用程序
/var:经常变化的文件,如日志或数据库等

2.编写函数,用strerror函数实现perror函数的功能。

先简单介绍一下strerror和perror
在linux下的c语言程序运行过程当中有一个整形的errno全局变量一直存在,它的值即为程序运行的错误码的值.
将errno的值传入strerror中,即可得到错误码对应的错误名称.
而perror则是将传入自身的字符串最先打印,后面将错误名称打印.

//通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述,方便用户查找错误。
char  * strerror(int  errnum);
//简单的说:就是errno转为错误字符串。

void perror(const char *s);
//将上一个函数的出错信息输出到标准设备。
//参数s所指的字符串先打印,后面跟上错误原因字符串。

答案如下:

void  myperror(char * str)
{
	extern int errno;
	char *error=strerror(errno);
	printf("%s: %s\n",str,error);
}

第二章:文件与目录管理

1.什么是文件描述符?什么是流?二者有什么区别和联系?

文件描述符是一个非负整数,它是文件进行输入输出的一个索引
流是对输入输出设备的抽象,具有方向性
同:1 都是程序和被操作文件之间连接,并可以在此基础上进行读着操作
2 都能和普通文件,设备文件等连接,用户打开一个文件,要不返回一个文件描述符,要不返回一个流
3 都包含了很多库函数
异:文件描述符是个整数,流是一个指向结构体的指针

2.用creat、open、close等系统调用,实现fopen、fclose的功能

3.设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件;读取系统文件“etc/passwd”,把文件中的内容都写入“pass”文件。

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
	int fd1, fd2;
	char buf[1024];

	fd1=open("pass",O_CREAT|O_RDWR|O_TRUNC,0666);
	assert(fd1 > 0);

	fd2=open("/etc/passwd", O_RDONLY);

	int len;
	while((len = read(fd2, buf, 1024)) > 0)
	{
	    write(fd1, buf, len);
	} 
	close(fd1);
	close(fd2);
}

4.填空

  1. 在Linux中,所有设备和磁盘文件的打开操作都可使用 open 系统调用来进行。
  2. 调用 creat 函数可以创建一个文件,调用 stat 函数可以获取文件的属性。
  3. 在Linux中,文件的权限分为 owngroupother 三类,每类分为 可读可写可执行 权限。
  4. 读取一个目录文件的内容时,可使用系统调用 opendir
  5. 若file文件存取权限为- r – x r- - - - -,这表明属主有 可读 权限,组用户有 可执行 权限,其他用户有 可执行 权限。

第三章:进程管理

1

  1. 在Linux中,进程的控制块是一个名为 task_struct 的结构体。
  2. 在Linux环境下,进程的两种运行模式为 用户模式root模式
  3. 在Linux的用户空间中,创建一个新进程的方法是由某个已经存在的进程调用 forkvfork 函数,被创建的新进程称为 子进程 ,已存在的进程称为 父进程
  4. 就绪态的进程是一个只需要 CPU 资源即可运行的进程。
  5. 进程结束时可以调用exit、_exit、abort三个函数,其中 abort 属于异常结束进程的方法。
  6. 某进程调用wait函数后,如果该进程没有子进程,则该进程将 立即返回结束
  7. 产生僵尸进程的要素是:子进程退出父进程没有回收内存资源 ;产生孤儿进程的要素是:父进程先与子进程退出,子进程被init进程收养
  8. 调用fork函数后在父进程中返回 子进程pid,在子进程中返回 0或负值(出错)

2.列出你的系统中当前所有正在运行的守护进程,简要说明其功能。

apmd:高级电源治理
Arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和ip地址对数据库
Autofs:自动安装治理进程automount,与NFS相关,依靠于NIS
Bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息
crond:linux下的计划任务
Dhcpd:启动一个DHCP(动态IP地址分配)服务器
Gated:网关路由守候进程,使用动态的OSPF路由选择协议
Httpd:WEB服务器
Inetd:支持多种网络服务的核心守候程序

3.编写一个程序,程序中创建一个子进程用来打开你的Linux系统中的浏览器;父进程等待子进程结束后输出子进程的退出值。

#include <stdio.h>
#include<stdlib.h>
#include<wait.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
int mian(int argc,char argv[])
{
    pid_ t pid; .
    int pid_ wait,status;
    if((pid=fork())<0){
        perror("fork");
        exit(1);
    }
    else if(pid==O){
        execle("/usr/bin/google-chrome ,google-chrome,NULL);
    }
    else{
        pid_ wait=wait(&status); 
        if(WIFEXITED(status)){
            printf("%d)n" ,WEXITSTATUS(status));
        }
    }
    return 0;
}

第四章:管道与重定向

1

  1. 命令who 1>usrlist表示 输出 重定向。

  2. dupdup2函数可以用来复制文件描述符。

  3. >>符号表示 追加 重定向。

  4. 编程将标准输出重定向到文件描述符为6对应的文件上,则应使用语句 dup2(6,1)

  5. 管道就是将前一个命令的 输出端 作为后一个命令的 输入端,分为 有名管道无名管道 两种,其中 无名管道 只能在有亲缘关系的进程间使用。

  6. 命名管道也称为FIFO文件。

  7. 使用pipe函数创建了匿名管道pfd,其中pfd[ 0 ]为管道的读端,pfd[ 1 ]为管道的写端。

2.请说明匿名管道和命名管道的异同点

异:1.匿名管道是由pipe函数创建 并打开的
命名管道是由mkfifo函数创建 的 ,打开用open
2. 匿名管道只能用于有亲缘关系的进程之间的通信,而命名管道则可以用于任意两个进程间的通信。
3. 匿名管道的生存依附于所在进程,命名管道的生存则不依附进程
同:1.都可以由read,write进行读写
2. 数据在这两者中都遵循FIFO原则

3.通过管道模拟实现Shell命令:cat file | sort。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
int main(void)
{
   int fd[2]; 
   pid_t pid;
   int start_val;
   if(pipe(fd))
 {
    printf("pipe error!\n");
    exit(1);
 }
pid=fork();

  switch(pid)
 {
  case -1:
          printf("fork error!\n");
          exit(1);
  case 0:
         close(0);
         close(fd[1]);
         dup(fd[0]);
         printf("child program!\n");
         execlp("sort","sort",NULL);        
         exit(0);
  default:
          close(1);
          close(fd[0]);        
          dup(fd[1]);
          printf("parent program!\n");
          execlp("cat","cat","file.txt",NULL);
          wait(&start_val);
          exit(0);
 }
return 0;
}

第五章:信号

1

  1. 在实际应用中,一个用户进程常常需要对多个信号做出处理。为了方便对多个信号进行处理,在Linux系统中引入 信号集 的概念。

  2. 进程可以忽略大部分信号,除了 SIGSTOPSIGKILL 信号。

  3. 在kill(pid,signum)函数中,pid>0表示 将信号传给进程识别码为 pid 的进程

  4. Ctrl+\发送一个 SIGQUIT 信号。

  5. SIGHUP信号的作用是 发送一个连接断开信号 ,SIGCONT信号的作用是 让一个停止的进程继续执行

2有哪些事件或情况会产生信号?

1.当用户按某些终端键时,将产生信号。
终端上按“Ctrl+c”组合键通常产生中断信号 SIGINT,终端上按“Ctrl+\”键通常产生中断信号 SIGQUIT,终端上按“Ctrl+z”键通常产生中断信号 SIGSTOP 等。

2.硬件异常将产生信号。
比如数据运算时,除数为0;或者无效的存放访问等.这些条件通常由硬件检测到,并通知内核,然后内核为该条件发生时正在运行的进程产生适当的信号.。

3.软件异常将产生信号。
当检测到某种软件条件已发生,并将其通知有关进程时,产生信号。

4.调用 kill() 函数将发送信号。
注意:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。

5.运行 kill 命令将发送信号。
此程序实际上是使用 kill 函数来发送信号。也常用此命令终止一个失控的后台进程。

3.为什么说信号机制是一种异步通信方式?

因为程序在运行的过程中并不知道将会发生什么,因此进程不会去等某个事情发生,而是一直执行自己的事情,当发生一些特定的事件的时候,比如键盘ctrl+c的时候,我们会发送一个信号给进程,此时进程收到了信号,从而执行对信号的处理。因此信号机制是一种异步通信。

4.为SIGUSR1信号安装一个处理函数,当捕捉到该信号时,显示当前的系统时间。用raise发送信号测试是否成功。

void func()
{
    time_t timep;
    time (&timep);
    printf(%s”,asctime(gmtime(&timep)));
}
void main() 
{
	signal(SIGUSR1,&func);
	raise()
}

Linux操作系统编程课程期末试卷

1.在UNIX/Linux系统中,可以认为操作系统用了三张表来描述一个打开的文件,请问是哪三张表,这三张表各自描述了文件的哪些属性,它们之间是如何联系起来的?

1.文件描述符表 文件表 索引节点表
2.文件描述符表: 文件描述符标志,指向一个文件表项的指针
文件表: 文件状态标志,文件读写偏移量,指向该文件索引节点表项的指针.
索引节点表: 文件属性,数据块位置,当前文件长度
3.通过指针指向对应表项

2.在UNIX/Linux系统中/etc/shadow文件用来存储用户密码。所有用户都可以通过执行passwd命令( /usr/bin/passwd)修改自己的密码(修改/etc/shadow文件),但非root的其他用户对/etc/shadow文件没有读写权限,如下图所示:

图一
passwd命令的文件权限如下图所示:
图二
请阐述为什么所有用户都可以通过执行passwd命令修改自己的密码(修改/etc/shadow文件)?
passwd这个命令设置了s(setuid)权限,当一个可以执行程序具有setuid权限,用户执行这个程序时,将以这个程序所有着身份执行。而passwd的拥有者是root用户,因此普通用户虽然没有读写/etc/shadow文件的权限但是可以修改自己的密码。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值