linux知识点总结

更新时间:2024-03-31 22:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

七:file

1. 叙述linux的文件系统框架,并解释其中各个部分。

boot :启动相关的程序和配置

bin :常用的Linux命令,这些命令通常为可执行文件或这些文件的链接

sbin :通常为根用户准备的命令 lib :系统常用库

usr :用户安装的文件、库、开发库等 root :根用户的用户文件 home :普通用户的用户文件 etc :系统或程序的配置文件 var :系统中服务器数据、日志 proc :系统状态信息 dev :系统设备

mnt、media :其他分区的挂载点(如Windows磁盘分区、光盘或软件等)

tmp :临时文件 lost+found 磁盘孤立扇区

2. 叙述超级块、inode、dentey和file四大数据结构的作用和主要内容。 超级块:

作用:代表了整个文件系统,记录了文件系统的整体信

内容:文件系统的状态、文件系统类型、块大小、区块数、索引节点数、脏标志、操作方法 inode(索引节点)

作用:代表了操作系统中的一个文件,无论该文件是否被打开,它都包含了文件操作的所有信息

内容:文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。 dentey(目录项):

作用:代表了一个目录,用来组成文件的路径,并利用其实现路径的管理

内容:包括该目录对象对应的索引节点,子目录链表,父目录目录项对象,与它同级的目录的目录项对象链表,使用计数,缓存标志 file(文件):

作用:代表了被进程打开的文件,是可以读写的实体 内容:包括相应的目录项对象、使用计数、访问模式、当前偏移量、操作方法等

3. 什么是文件描述符?它与fopen返回的文件指针有什么关系?

文件描述符是一个索引值,指向内核为每一个进程所维

护的该进程打开文件的记录表。

关系:fopen返回的文件指针是文件描述符所指向的文件描述符表中的一个表项

4. 分别叙述fopen和open的参数设置以及它们的区别。

fopen参数:path是指定的文件的路径,mode是文件的打开模式,模式可以为r、r+、w、w+、a、a+ open参数:pathname是欲打开文件的路径,flags是一些标志位,mode是文件的操作权限。

区别:(1)open返回一个文件描述符(int),fopen返回一个文件指针(FILE*)。(2)open无缓冲,fopen有缓冲。(3)open与 read, write 等配合使用, fopen与 fread, fwrite等配合使用。(4)fopen是在open的基础上扩充而来的,在大多数情况下,用fopen。 5. 叙述pipe和mkfifo两种管道函数的区别。

pipe创建匿名管道,mkfifo创建有名管道。

pipe管道是进程通信的一种形式,mkfifo管道被看作是一个文 件

6. 使用匿名管道技术,编程实现“ls -1|wc -l”。

#include #include #include #include

#include #include #include #include #include #define ERR_EXIT(m) do {

perror(m);

exit(EXIT_FAILURE); } while(0)

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

int pipefd[2]; if (pipe(pipefd) == -1) ERR_EXIT(\

pid_t pid; pid = fork(); if (pid == -1)

ERR_EXIT(\

if (pid == 0) {

dup2(pipefd[1], STDOUT_FILENO); //输出重定向

close(pipefd[1]); close(pipefd[0]);

execlp(\ fprintf(stderr, \ exit(EXIT_FAILURE); }

dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); close(pipefd[1]);

execlp(\ fprintf(stderr, \ exit(EXIT_FAILURE);

return 0; }

7. 编写两个进程a和b,使用有名管道进行通信。a向b传送字符串“hello”,b接收并打印。

进程a: #include #include #include #include #include #include #define PATH \ #define SIZE 128 int main() { umask(0);

if (mkfifo (PATH,0666|S_IFIFO) == -1)//创建有名管道,mkfifo(管道文件名,管> 理权限)

{ //成功返回0 失败返回-1 perror (\ exit(0); }

int fd = open (PATH,O_RDONLY); if (fd<0) {

printf(\

return 0; } 进程b: #include #include #include #include #include #include #define PATH \ #define SIZE 128 int main() {

char Buf[SIZE]; while(1) {

printf(\

fflush(stdout); //清空缓冲区,并把缓冲区的内容输出 ssize_t s = read(0,Buf,sizeof(Buf)); //ssize_t 一个类型 if (s<0) //read(文件标识符,数据缓冲

区,读取数据尺寸)

{ //失败或中断返回-1 perror(\ exit(1);

}

else if(s==0) { printf(\ return 1;

} else{ Buf[s]= '\\0'; //最后一位,字符串结束符

write(fd,Buf,strlen(Buf)); //write(文件表识符,数据缓冲区,写入文件尺寸)

}

} return 0; }

7.编程以可读写方式打开第一个参数表示的二进制文件,改写里面第三个字节为0fH,再关闭它。 八:mem

1. 叙述进程的用户空间和内核空间都有哪些种类,列举各类内存申请函数并说明之。

代码区、静态数据变量、堆区、栈区

用户空间用vmalloc/malloc分配内存,内核空间用kmalloc/vmalloc分配内存。

malloc:是动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,函数声明void *malloc(size_t size);

vmalloc/kmalloc:在设备驱动程序或者内核模块中动态开辟内存,释放内存用的是kfree,vfree,kmalloc分配的内存是物理上的连续,vmalloc分配的内存只是线性上的连续。 4.编写两个进程a和b,使用mmap进行通信,a向共享内存写入字符串“hello”后退出,b接收后打印出来。

5.编写一个程序,创建一个子进程,之后父子进程使用mmap函数进行匿名通讯,子进程向共享内存写入字符串“hello”后

退出,父进程接收后打印出来,并且等待子进程退出后结束。

#include #include #include #include #include #include #include #include

void mmapcopy(int fd, int size) {

char *bufp;

//void * start_addr = 0; //start_addr = (void *)0x80000; bufp = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

if (bufp == (void *)-1)

fprintf(stderr, \

memcpy(bufp, \

write(1, bufp, size); munmap(bufp, size); return; }

int main(int argc, char **argv) {

struct stat stat; if (argc != 2) {

printf(\ exit(0); }

//int fd = atoi(*argv[1]); //mmap()

int fd = open(argv[1], O_RDWR, 0); // O_RDWR 才能被读写。

if (fd < 0)

fprintf(stderr, \ // 使用异常检查是个好习惯, 他可以帮助程序员迅速定位出错的地方!

fstat(fd, &stat);

mmapcopy(fd, stat.st_size);

//while(1); close(fd); exit(0); }

本文来源:https://www.bwwdw.com/article/z1mr.html

Top