当前位置: 技术问答>linux和unix
windows下的.exe是执行文件,Linux下可执行文件用什么做扩展名呢?
来源: 互联网 发布时间:2015-11-29
本文导语: windows下的.exe是执行文件,Linux下可执行文件用什么做扩展名呢? | linux下,当你使用./xxx运行一个程序时,首先是SHELL来接管你的输入,然后用fork派生子进程,最后用execv系列将你的那个程序...
windows下的.exe是执行文件,Linux下可执行文件用什么做扩展名呢?
|
linux下,当你使用./xxx运行一个程序时,首先是SHELL来接管你的输入,然后用fork派生子进程,最后用execv系列将你的那个程序的代码交给内核
1。检查你运行的文件的属性,其属性在它的I节点中描述,如果你的那个文件不是可执行的属性,结果就会拒绝执行,如果有可执行的属性,但可执行的权限高于你目前正在使用的用户的权限,拒绝执行
2。检查是SHELL文件吗?如果是,调用相应的SHELL来解析你的这个脚本文件
3。是ELF文件格式吗??是coff文件格式吗?是a.out文件格式吗?如果是其中任何一种,并且当前的LINUX内核都支持这三种文件格式,那么就由操作系统内核分析你的文件格式,去掉文件头信息,将真正的代码,数据等加载进内存(实际过程并不是这样的,只不过为了描述简单,所以省略了很多细节,更多详细说明,请参见内核中的execv系统调用)...
4.等待系统的进程调度,当内核选中你的那个程序的时候,你的那个程序就得到运行了
LINUX下的文件扩展名是形同虚设的,只是一种习惯,为了给用户更好的理解其作用,比如配置文件一般都以.conf结尾,“文本文件”一般都以.txt结尾(主要是为了跟WINDOWS用户习惯相接近),ELF文件不用扩展名,所以当你说可执行文件的时候千万不要说是exe文件,那是很不严格的说法,只说明你仅是一个WINDOWS程序员而已
1。检查你运行的文件的属性,其属性在它的I节点中描述,如果你的那个文件不是可执行的属性,结果就会拒绝执行,如果有可执行的属性,但可执行的权限高于你目前正在使用的用户的权限,拒绝执行
2。检查是SHELL文件吗?如果是,调用相应的SHELL来解析你的这个脚本文件
3。是ELF文件格式吗??是coff文件格式吗?是a.out文件格式吗?如果是其中任何一种,并且当前的LINUX内核都支持这三种文件格式,那么就由操作系统内核分析你的文件格式,去掉文件头信息,将真正的代码,数据等加载进内存(实际过程并不是这样的,只不过为了描述简单,所以省略了很多细节,更多详细说明,请参见内核中的execv系统调用)...
4.等待系统的进程调度,当内核选中你的那个程序的时候,你的那个程序就得到运行了
LINUX下的文件扩展名是形同虚设的,只是一种习惯,为了给用户更好的理解其作用,比如配置文件一般都以.conf结尾,“文本文件”一般都以.txt结尾(主要是为了跟WINDOWS用户习惯相接近),ELF文件不用扩展名,所以当你说可执行文件的时候千万不要说是exe文件,那是很不严格的说法,只说明你仅是一个WINDOWS程序员而已
|
在linux下不向windows那样重视文件的名称,它是用文件的属性来区分是哪类文件的,而不是文件的名称。
|
用 ls -l filename看看
----x--x--x
第一个x表示此文件的owner有可执行的权限
第二个x表示此文件的owner所在的group的所有成员有可执行的权限
第三个x表示此文件的其他人有可执行的权限
当然,直接运行的时候还要看PATH,如果当前目录不在PATH中,那么可以使用./filename来直接运行该程序,当然,前提是你要有可执行的权限
----x--x--x
第一个x表示此文件的owner有可执行的权限
第二个x表示此文件的owner所在的group的所有成员有可执行的权限
第三个x表示此文件的其他人有可执行的权限
当然,直接运行的时候还要看PATH,如果当前目录不在PATH中,那么可以使用./filename来直接运行该程序,当然,前提是你要有可执行的权限
|
linux原则上是没有扩展名这个概念的,它是通过文件的属性来判断此文件是否可读、可写或者可执行,但是习惯上用.o等等的扩展名来表示可执行文件,但是这并不是必需的;如果文件的属性表明是可执行的,那么不用任何扩展名照样可以执行。
|
Windows的exe头也有MZ(DOS带来的,OS/2什么的也有),PE标记,所以也称PE文件
linux多数都是ELF
OS X是比较特殊的Mach-O
说执行权限、chmod什么的都严重误导,Windows下面你把你用户的执行权限禁止掉了,一样不能执行。Windows只不过是对Administrator这样的用户默认开启执行权限罢了
下面引用redgrid发表的内容:
Linux不是根据文件名来判断是否执行文件。而是通过文件开始的2个字节值(位于头部中)来判断文件的类型的。这两个字节被称为魔幻数(Magic Number),不同的值被定义为不同类型的文件。对于MINIX的a.out可执行文件来说,其Magic Number 是 0x0301。当你执行一个文件时,内核执行程序(exec())就会读取该执行文件的头部信息来分析,如果确实是一个可执行文件,例如其Magic number是 0x0301,并且头部中其他信息也符合要求,那么内核就会为该执行文件设置执行环境,然后就会(退出)跳转到内存中该程序开始处执行。当然,由于程序还没有被加载到内存中,因此一执行就会引发内存异常,从而在异常处理程序中执行程序的加载操作。 另外,头部不会被加载进内存中
关于这个,我做个考古。魔幻数法是SCO(到处起诉Linux侵权的那个公司,UNIX在AT&T之后的所有者)的发明,Executable and Linking Format则是USL(UNIX系统实验室)发明ABI时候的产品。这些都是UNIX时代的东西了,所以几乎所有操作系统都是这样的(包括MSDOS那个MZ),这个文章后面说的MINIX亦是(Linux==Linus的MINIX)。扩展名则是在此之前的系统的遗留产物。
顺便说一句,ELF的魔幻数是4位。COFF是Windows用的对象格式,a.out根本不是什么格式,不要混为一谈
linux多数都是ELF
OS X是比较特殊的Mach-O
说执行权限、chmod什么的都严重误导,Windows下面你把你用户的执行权限禁止掉了,一样不能执行。Windows只不过是对Administrator这样的用户默认开启执行权限罢了
下面引用redgrid发表的内容:
Linux不是根据文件名来判断是否执行文件。而是通过文件开始的2个字节值(位于头部中)来判断文件的类型的。这两个字节被称为魔幻数(Magic Number),不同的值被定义为不同类型的文件。对于MINIX的a.out可执行文件来说,其Magic Number 是 0x0301。当你执行一个文件时,内核执行程序(exec())就会读取该执行文件的头部信息来分析,如果确实是一个可执行文件,例如其Magic number是 0x0301,并且头部中其他信息也符合要求,那么内核就会为该执行文件设置执行环境,然后就会(退出)跳转到内存中该程序开始处执行。当然,由于程序还没有被加载到内存中,因此一执行就会引发内存异常,从而在异常处理程序中执行程序的加载操作。 另外,头部不会被加载进内存中
关于这个,我做个考古。魔幻数法是SCO(到处起诉Linux侵权的那个公司,UNIX在AT&T之后的所有者)的发明,Executable and Linking Format则是USL(UNIX系统实验室)发明ABI时候的产品。这些都是UNIX时代的东西了,所以几乎所有操作系统都是这样的(包括MSDOS那个MZ),这个文章后面说的MINIX亦是(Linux==Linus的MINIX)。扩展名则是在此之前的系统的遗留产物。
顺便说一句,ELF的魔幻数是4位。COFF是Windows用的对象格式,a.out根本不是什么格式,不要混为一谈