linux知识点总结.docx
《linux知识点总结.docx》由会员分享,可在线阅读,更多相关《linux知识点总结.docx(9页珍藏版)》请在冰豆网上搜索。
linux知识点总结
七:
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
#defineERR_EXIT(m)
do{
perror(m);
exit(EXIT_FAILURE);
}while(0)
intmain(intargc,char*argv[])
{
intpipefd[2];
if(pipe(pipefd)==-1)
ERR_EXIT("pipeerror");
pid_tpid;
pid=fork();
if(pid==-1)
ERR_EXIT("forkerror");
if(pid==0)
{
dup2(pipefd[1],STDOUT_FILENO);//输出重定向
close(pipefd[1]);
close(pipefd[0]);
execlp("ls","ls","-1",NULL);
fprintf(stderr,"errorexecutels\n");
exit(EXIT_FAILURE);
}
dup2(pipefd[0],STDIN_FILENO);
close(pipefd[0]);
close(pipefd[1]);
execlp("wc","wc","-1",NULL);
fprintf(stderr,"errorexecutewc\n");
exit(EXIT_FAILURE);
return0;
}
7.编写两个进程a和b,使用有名管道进行通信。
a向b传送字符串“hello”,b接收并打印。
进程a:
#include
#include
#include
#include
#include
#include
#definePATH"./fifo"
#defineSIZE128
intmain()
{
umask(0);
if(mkfifo(PATH,0666|S_IFIFO)==-1)//创建有名管道,mkfifo(管道文件名,管>理权限)
{//成功返回0失败返回-1
perror("mkefifoerror");
exit(0);
}
intfd=open(PATH,O_RDONLY);
if(fd<0)
{
printf("openfdiserror\n");
return0;
}
进程b:
#include
#include
#include
#include
#include
#include
#definePATH"./fifo"
#defineSIZE128
intmain()
{
charBuf[SIZE];
while
(1)
{
printf("pleaseEnter#:
");
fflush(stdout);//清空缓冲区,并把缓冲区的内容输出
ssize_ts=read(0,Buf,sizeof(Buf));//ssize_t一个类型
if(s<0)//read(文件标识符,数据缓冲区,读取数据尺寸)
{//失败或中断返回-1
perror("readisfailed");
exit
(1);
}
elseif(s==0)
{
printf("readisclosed!
");
return1;
}
else{
Buf[s]='\0';//最后一位,字符串结束符
write(fd,Buf,strlen(Buf));//write(文件表识符,数据缓冲区,写入文件尺寸)
}
}
return0;
}
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
voidmmapcopy(intfd,intsize)
{
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,"mmap:
%s\n",strerror(errno));
memcpy(bufp,"Linuxdd",7);
write(1,bufp,size);
munmap(bufp,size);
return;
}
intmain(intargc,char**argv)
{
structstatstat;
if(argc!
=2)
{
printf("error.\n");
exit(0);
}
//intfd=atoi(*argv[1]);
//mmap()
intfd=open(argv[1],O_RDWR,0);//O_RDWR才能被读写。
if(fd<0)
fprintf(stderr,"open:
%s\n",strerror(errno));//使用异常检查是个好习惯,他可以帮助程序员迅速定位出错的地方!
fstat(fd,&stat);
mmapcopy(fd,stat.st_size);
//while
(1);
close(fd);
exit(0);
}