本篇文章给大家谈谈linux如何将路径分割,以及linux路径分隔符对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、如何在Linux中修改环境变量PATH
- 2、Linux 虚拟地址空间如何分布
- 3、linux split怎么根据"\"进行分割
- 4、如何用命令将linux目录下的文件名及路径以“;”分隔拼接到一起输出出来。
- 5、linux的相对路径怎么表示?
- 6、windows和Linux以及Java中路径分隔符的不同
1、如何在Linux中修改环境变量PATH
修改Linux的PATH格式是这样的,以在PATH环境变量中加入/root这个路径为例:
PATH="$PATH":/root
首先PATH环境变量的各个路径之间要用英文冒号分割(Windows的PATH环境变量的路径之间用的是英文分号分割)。"$PATH"这一部分代表PATH环境变量原有的内容,因为PATH环境变量是非常重要,对PATH环境变量的修改都是在原PATH的内容上进行添加,所以先用"$PATH"导入原PATH的内容。后面再用英文冒号分割开/root这个新添加的内容,表示在原PATH的基础上添加/root这个路径。
对PATH的修改应该写在哪个配置文件中呢?如果想让设置只对当前用户有效,就需要在~/.bashrc文件中添加设置,以添加/root目录为例需要添加如下两行:
PATH="$PATH":/root
export PATH
也可以将两行设置写成一行:export PATH="$PATH":/root
如果想让PATH环境变量的设置对所有用户都有效,则要把设置添加到/etc/profile这个全局配置文件中,添加的内容和在~/.bashrc中的一样。
修改完配置文件后,如果想让设置马上生效,还需要运行source命令,比如:source ~/.bashrc,否则设置只在下次登录时才会生效(也就是说要重新登录)。
2、Linux 虚拟地址空间如何分布
一个进程的虚拟地址空间主要由两个数据结来描述。一个是最高层次的:mm_struct,一个是较高层次的:vm_area_structs。最高层次的mm_struct结构描述了一个进程的整个虚拟地址空间。较高层次的结构vm_area_truct描述了虚拟地址空间的一个区间(简称虚拟区)。
1. MM_STRUCT结构
mm_strcut 用来描述一个进程的虚拟地址空间,在/include/linux/sched.h 中描述如下:
struct mm_struct {
struct vm_area_struct * mmap; /* 指向虚拟区间(VMA)链表 */
rb_root_t mm_rb; /*指向red_black树*/
struct vm_area_struct * mmap_cache; /* 指向最近找到的虚拟区间*/
pgd_t * pgd; /*指向进程的页目录*/
atomic_t mm_users; /* 用户空间中的有多少用户*/
atomic_t mm_count; /* 对"struct mm_struct"有多少引用*/
int map_count; /* 虚拟区间的个数*/
struct rw_semaphore mmap_sem;
spinlock_t page_table_lock; /* 保护任务页表和 mm-rss */
struct list_head mmlist; /*所有活动(active)mm的链表 */
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_address;
unsigned dumpable:1;
/* Architecture-specific MM context */
mm_context_t context;
};
对该结构进一步说明如下:
在内核代码中,指向这个数据结构的变量常常是mm。
每个进程只有一个mm_struct结构,在每个进程的task_struct结构中,有一个指向该进程的结构。可以说,mm_struct结构是对整个用户空间的描述。
一个进程的虚拟空间中可能有多个虚拟区间(参见下面对vm_area_struct描述),对这些虚拟区间的组织方式有两种,当虚拟区较少时采用单链表,由mmap指针指向这个链表,当虚拟区间多时采用“红黑树(red_black
tree)”结构,由mm_rb指向这颗树。在2.4.10以前的版本中,采用的是AVL树,因为与AVL树相比,对红黑树进行操作的效率更高。
因为程序中用到的地址常常具有局部性,因此,最近一次用到的虚拟区间很可能下一次还要用到,因此,把最近用到的虚拟区间结构应当放入高速缓存,这个虚拟区间就由mmap_cache指向。
指针pgt指向该进程的页目录(每个进程都有自己的页目录,注意同内核页目录的区别),当调度程序调度一个程序运行时,就将这个地址转成物理地址,并写入控制寄存器(CR3)。
由于进程的虚拟空间及其下属的虚拟区间有可能在不同的上下文中受到访问,而这些访问又必须互斥,所以在该结构中设置了用于P、V操作的信号量mmap_sem。此外,page_table_lock也是为类似的目的而设置。
虽然每个进程只有一个虚拟地址空间,但这个地址空间可以被别的进程来共享,如,子进程共享父进程的地址空间(也即共享mm_struct结构)。所以,用mm_user和mm_count进行计数。类型atomic_t实际上就是整数,但对这种整数的操作必须是“原子”的。
另外,还描述了代码段、数据段、堆栈段、参数段以及环境段的起始地址和结束地址。这里的段是对程序的逻辑划分,与我们前面所描述的段机制是不同的。
mm_context_t是与平台相关的一个结构,对i386 几乎用处不大。
在后面对代码的分析中对有些域给予进一步说明。
2. VM_AREA_STRUCT 结构
vm_area_struct描述进程的一个虚拟地址区间,在/include/linux/mm.h中描述如下:
struct vm_area_struct
struct mm_struct * vm_mm; /* 虚拟区间所在的地址空间*/
unsigned long vm_start; /* 在vm_mm中的起始地址*/
unsigned long vm_end; /*在vm_mm中的结束地址 */
/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;
pgprot_t vm_page_prot; /* 对这个虚拟区间的存取权限 */
unsigned long vm_flags; /* 虚拟区间的标志. */
rb_node_t vm_rb;
/*
* For areas with an address space and backing store,
* one of the address_space-i_mmap{,shared} lists,
* for shm areas, the list of attaches, otherwise unused.
*/
struct vm_area_struct *vm_next_share;
struct vm_area_struct **vm_pprev_share;
/*对这个区间进行操作的函数 */
struct vm_operations_struct * vm_ops;
/* Information about our backing store: */
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
units, *not* PAGE_CACHE_SIZE */
struct file * vm_file; /* File we map to (can be NULL). */
unsigned long vm_raend; /* XXX: put full readahead info here. */
void * vm_private_data; /* was vm_pte (shared mem) */
};
vm_flag是描述对虚拟区间的操作的标志,其定义和描述如下
标志名 描述
VM_DENYWRITE 在这个区间映射一个打开后不能用来写的文件。
VM_EXEC 页可以被执行。
VM_EXECUTABLE 页含有可执行代码。
VM_GROWSDOWN 这个区间可以向低地址扩展。
VM_GROWSUP 这个区间可以向高地址扩展。
VM_IO 这个区间映射一个设备的I/O地址空间。
VM_LOCKED 页被锁住不能被交换出去。
VM_MAYEXEC VM_EXEC 标志可以被设置。
VM_MAYREAD VM_READ 标志可以被设置。
VM_MAYSHARE VM_SHARE 标志可以被设置。
VM_MAYWRITE VM_WRITE 标志可以被设置。
VM_READ 页是可读的。
VM_SHARED 页可以被多个进程共享。
VM_SHM 页用于IPC共享内存。
VM_WRITE 页是可写的。
较高层次的结构vm_area_structs是由双向链表连接起来的,它们是按虚地址的降顺序来排列的,每个这样的结构都对应描述一个相邻的地址空间范围。之所以这样分割,是因为每个虚拟区间可能来源不同,有的可能来自可执行映象,有的可能来自共享库,而有的则可能是动态分配的内存区,所以对每一个由vm_area_structs结构所描述的区间的处理操作和它前后范围的处理操作不同。因此Linux
把虚拟内存分割管理,并利用了虚拟内存处理例程(vm_ops)来抽象对不同来源虚拟内存的处理方法。不同的虚拟区间其处理操作可能不同,Linux在这里利用了面向对象的思想,即把一个虚拟区间看成一个对象,用vm_area_structs描述了这个对象的属性,其中的vm_operation结构描述了在这个对象上的操作,其定义在/include/linux/mm.h中:
/*
* These are the virtual MM functions - opening of an area, closing and
* unmapping it (needed to keep files on disk up-to-date etc), pointer
* to the functions called when a no-page or a wp-page exception occurs.
*/
struct vm_operations_struct {
void (*open)(struct vm_area_struct * area);
void (*close)(struct vm_area_struct * area);
struct page * (*nopage)(struct vm_area_struct * area, unsigned long address, int unused);
};
vm_operations结构中包含的是函数指针;其中,open、close分别用于虚拟区间的打开、关闭,而nopage用于当虚存页面不在物理内存而引起的“缺页异常”时所应该调用的函数。
3.红黑树结构
Linux内核从2.4.10开始,对虚拟区的组织不再采用AVL树,而是采用红黑树,这也是出于效率的考虑,虽然AVL树和红黑树很类似,但在插入和删除节点方面,采用红黑树的性能更好一些,下面对红黑树给予简单介绍。
一颗红黑树是具有以下特点的二叉树:
每个节点着有颜色,或者为红,或者为黑
根节点为黑色
如果一个节点为红色,那么它的子节点必须为黑色
从一个节点到叶子节点上的所有路径都包含有相同的黑色节点数
3、linux split怎么根据"\"进行分割
将一个大文件分成若干个小文件方法
例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式
先利用
wc -l BLM.txt 读出 BLM.txt 文件一共有多少行
再利用 split 命令
split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
将 文件 BLM.txt 分成若干个小文件,每个文件2482行(-l 2482),文件前缀为BLM_ ,系数不是字母而是数字(-d),后缀系数为四位数(-a 4)
4、如何用命令将linux目录下的文件名及路径以“;”分隔拼接到一起输出出来。
[root@localhost ~]# ls /home | sed 's@.*@/home/@' | tr "\n" ";"
/home/aquota.group;/home/aquota.user;/home/jack;/home/lost+found;
这就是你想要的结果
5、linux的相对路径怎么表示?
1、绝对路径
从根目录开始,依次将各级子目录的名字组合起来,形成的路径就称为某个文件的绝对路径。例如,根目录(/)下有目录usr,usr目录下有子目录bin,bin目录下有文件chsh,则chsh文件的绝对路径就是:/usr/bin/chsh
2、相对路径
相对当前所在路径的位置,例如当前所在的位置为/usr,也就是在根目录的usr子目录下,则chsh文件相对当前位置的路径为:bin/chs
一·在windows读取文件可以用\,但在字符串里面\被作为转义字符使用,那么在描述路径时有两种方式:
'c:\\a.txt',转义的方式
r'c:\a.txt',声明字符串不需要转义
这样就实现了用\来访问路径。
二·python提供了兼容处理,让Linux风格路径在windows下可用,于是很多时候大家都会选Linux风格。这样简单的脚本可以在两个平台下都能运行。
python对windows路径处理有一个库叫ntpath。
windows用\分割路径是因为当年DOS时代将/作为参数引导使用了,懒惰的某人不愿花时间处理相关解析,于是为了赶工粗暴的使用了\替代。
三·不能直接使用C://这样的绝对路径,不符合网络地址规范,案例如下:
var img = new Image();
img.src = "C://Users//Administrator//Desktop//shilian//_ditu.png"; // Refused to load the image 'c://Users//Administrator//Desktop//shilian//_ditu.png' because it violates the following Content Security Policy directive: "img-src * data: blob:".
四·相对路径down下来,也是基于http的访问协议,或者本地的file://协议,“C://"前面加上”file://“
6、windows和Linux以及Java中路径分隔符的不同
windows中路径分割用 \ 符号,linux中用 / 符号,在java中的路径符号和linux中的相同,如果想用window的方式表达路径,那么可以在 \符号前加一个 / ,如C:\Program Files\Java\jdk 写成C:\\Program Files\\Java\\jdk
关于linux如何将路径分割和linux路径分隔符的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。