一直都很好奇linux下./xx程序怎么执行起来的?
昨晚有个小伙伴简单分享了下,有了一个不成熟的认识:
在linux的shell中输入./可执行程序后,shell会fork出一个子进程来处理,进行一系列的内核接口调用,加载elf文件到系统中,这过程做的操作全是linux内核干的活,比如开辟进程栈(进程的主线程栈),然后进行一系列准备(主要是进程的创建),一切就绪后,就会运行你的程序。
原来进程栈(进程的主线程栈)是映射到进程虚拟地址空间的栈区,而通过pthread_create创建的普通线程的线程栈是glibc/uclibc等运行时库从堆里分配的空间映射到进程虚拟地址空间的堆区的!不是栈区!这就是进程栈和线程栈区别,或者说主线程与普通线程的栈区别!
用户态的栈是可以动态扩容的,在linux下有个宏,默认是8M。在8M内,所需栈要增加就给你扩容,如果再增加就超过8M的阈值了,那么就会发出段错误信号SIGSEGV给进程,俗称段错误。