所谓单入口文件,就是程序项目或者系统被访问请求的时候,第一个被访问到的文件,所有的指令功能都是从这文件分发出去,再找相对应的模块进行处理,一些初始化的工作也在这里进行,这个文件可以根据不同的请求去调用框架不同的模块,这里甚至可以设定一些参数,方便以后的开发和维护。
入口点是WinMain函数
Windows消息机制的流程:
1Windows中有一个系统消息队列,对于每一个正在执行的Windows应用程序,系统为其建立一个“消息队列”,即应用程序队列,用来存放该程序可能创建的各种窗口的消息。应用程序中含有一段称作“消息循环”的代码,用来从消息队列中检索这些消息并把它们分发到相应的窗口函数中。
2Windows为当前执行的每个Windows程序维护一个「消息队列」。在发生输入事件之后,Windows将事件转换为一个「消息」并将消息放入程序的消息队列中。程序通过执行一块称之为「消息循环」的程序代码从消息队列中取出消息
编译技术什么是程序的入口语句?我们刚开始学习C语言的时候,总会以一个hello world程序开始了解,并会被告知main是程序的入口函数。
那么是否有怀疑过,既然main是函数的入口,那么全局函数是如何初始化的?
实际上main并不是一个程序的入口地址。
以linux为例,一个可执行程序是ELF格式(Executable and Linkable Format)。在ELF的文件头里记录了当程序入口地址,该入口地址是内核加载该文件后的第一条指令执行的地方。
可以写个hello world,生成可执行文件,然后通过readelf -h aout查看文件头:
ELF 头: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 类别: ELF64 数据: 2 补码,小端序 (little endian) 版本: 1 (current) OS/ABI: UNIX - System V ABI 版本: 0 类型: DYN (共享目标文件) 系统架构: Advanced Micro Devices X86-64 版本: 0x1 入口点地址: 0x1040 程序头起点: 64 (bytes into file) Start of section headers: 14688 (bytes into file) 标志: 0x0 本头的大小: 64 (字节) 程序头大小: 56 (字节) Number of program headers: 11 节头大小: 64 (字节) 节头数量: 29 字符串表索引节头: 28
这里入口地址是0x1040。
让我们反编译看看:
0000000000001040 <_start>: 1040: f3 0f 1e fa endbr64 1044: 31 ed xor %ebp,%ebp 1046: 49 89 d1 mov %rdx,%r9 1049: 5e pop %rsi 104a: 48 89 e2 mov %rsp,%rdx 104d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp 1051: 50 push %rax 1052: 54 push %rsp 1053: 4c 8d 05 76 01 00 00 lea 0x176(%rip),%r8 # 11d0 <__libc_csu_fini> 105a: 48 8d 0d ff 00 00 00 lea 0xff(%rip),%rcx # 1160 <__libc_csu_init> 1061: 48 8d 3d d1 00 00 00 lea 0xd1(%rip),%rdi # 1139 <main> 1068: ff 15 72 2f 00 00 callq 0x2f72(%rip) # 3fe0 <__libc_start_main@GLIBC_225> 106e: f4 hlt 106f: 90 nop
0x1040对应的是_start函数,_start调用了glibc中的__libc_strat_main__libc_strat_main最终会调用main函数。(_start和__libc_start_main的分析见《程序员的自我修改——链接、装载与库》111)
既然知道main不是程序的真正入口,那么是否有办法在main之前或之后执行代码呢?
gcc提供了一组“进入”、“退出”函数可以首先这个功能:
Windows *** 作系统中,应用程序的入口文件是通常是一个拥有 "exe" 扩展名的可执行文件,该文件包含了启动程序所需要的所有信息和指令。当用户双击或使用命令行运行这个可执行文件时, *** 作系统会对其进行加载并开始执行,作为应用程序的入口点。在应用程序内部,入口点由一个特定的函数或方法来定义,该函数或方法被 *** 作系统调用以启动程序的正式执行。
这个是 *** 作系统和编译器决定的,系统和外部程序的一个约定。
*** 作系统要启动软件开发的一个模块。必须约定好,启动入口在哪里。我们开发的程序之所以能运行,随后生存一个标准的模版提交给 *** 作系统,系统启动我们的程序。
否则我们开发的程序模块无法启动了。只是一个约定入口函数名叫main。
以前一直都说Activity的人口是onCreate方法。
其实android上一个应用的入口,应该是ActivityThread。
和普通的java类一样,入口是一个main方法。
public static void main(String[] args) {
SamplingProfilerIntegrationstart();
// CloseGuard defaults to true and can be quite spammy We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs
CloseGuardsetEnabled(false);
EnvironmentinitForCurrentUser();
// Set the reporter for event logging in libcore
EventLoggersetReporter(new EventLoggingReporter());
SecurityaddProvider(new AndroidKeyStoreProvider());
ProcesssetArgV0("<pre-initialized>");
LooperprepareMainLooper();
ActivityThread thread = new ActivityThread();
threadattach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = threadgetHandler();
}
AsyncTaskinit();
if (false) {
LoopermyLooper()setMessageLogging(new
LogPrinter(LogDEBUG, "ActivityThread"));
}
Looperloop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
SparkSession。SparkSQL介绍说明,sparksql的程序入口是SparkSession。SparkSQL作为ApacheSpark中的一个模块,将关系处理与SparkAPI集成在一起。它是专为涉及大规模数据集的只读联机分析处理(OLAP)而设计的。
以上就是关于应用程序入口文件是什么全部的内容,包括:应用程序入口文件是什么、Windows程序的入口是哪里写出Windows消息机制的流程、编译技术什么是程序的入口语句等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)