首页 > 系统相关 >Linux可执行程序启动流程

Linux可执行程序启动流程

时间:2024-07-14 15:58:04浏览次数:18  
标签:19889 调用 19510 strace 流程 Linux 进程 可执行程序 函数

进程是如何启动的?

进程启动过程

示例代码

#include <stdio.h>
int main()
{
        printf("hello,world\r\n"); 
        return 0;
}

启动两个终端,使用strace命令跟踪进程启动过程strace -f -s 655000 -i -T -o output.txt -p 19510
各个选项参考strace的man手册
-f 跟踪由进程及其子进程发出的系统调用
- s 设置 strace 打印的字符串的最大长度
- i 在打印每条系统调用时,同时打印该调用的指令指针
- T 显示每次系统调用花费的时间
- o 将 strace 的输出重定向到文件中
-p 指定 strace 要跟踪的进程ID
其他选项参考man手册,截取出的有效记录如下

  • 1 19510 它是bin/bash程序启动的 19510它是进程的标识
  • 19510 [00007ffb18a075e2] clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ffb1934ca10) = 19889 <0.000188>
  • 2 19510进程调用clone/fork 系统函数并执行得到了一个新的子进程,这个新的子进程是19889 ,此时19510进程调用wait4在此阻塞
  • 19510 [00007ffb18a0725b] wait4(-1, <unfinished ...>
  • 3 新进程19889此时调用相关系统函数函数 execve 加载ELF可执行文件 demo2,[“./demo2”] 是命令行参数【执行参数】
    0x55c2a06d6690 /* 32 vars */ 是环境表 【环境参数】 是公共的,在Linux是供所有应用程序可以使用的公共数据
  • 19889 [00007ffb18a086fb] setpgid(19889, 19889) = 0 <0.000004> 19889 [00007ffb18a0782b] execve("./demo2", ["./demo2"], 0x55c2a06d6690 /* 32 vars */) = 0 <0.000394>
  • 4 加载所依赖的相关库文件 libc.so.6文件 ELF 文件 共享目标文件 共享库 【动态库】
  • 19889 [00007f551f604af1] openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 <0.000009>
  • 19889 [00007f551f604bb8] read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\2009\2\0\0\0\0\0@\0\0\0\0\0\0\0\200_[\0\0\0\0\0\0\0\0\0@\08\0\v\0@\0L\0K\0\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0h\2\0\0\0\0\0\0h\2\0\0\0\0\0\0\10\0\0\0\0\0\0\0\3\0\0\0\4\0\0\0\260\347\30\0\0\0\0\0\260\347\30\0\0\0\0\0\260\347\30\0\0\0\0\0\34\0\0\0\0\0\0\0\34\0\0\0\0\0\0\0\20\0\0\0\0\0\0\0\1\0\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\334\217\33\0\0\0\0\0\334\217\33\0\0\0\0\0\0\0 \0\0\0\0\0\1\0\0\0\6\0\0\0(\226\33\0\0\0\0\0(\226;\0\0\0\0\0(\226;\0\0\0\0\0XR\0\0\0\0\0\0\370\221\0\0\0\0\0\0\0\0 .....
  • 5 进程执行调用系统函数write向屏幕输出 字符串 “hello,world"的内容 上层的应用函数是printf 【打印函数,是标准库stdio.h头文件声明的】
    write在libc.so.6库里
  • 19889 [00007f551f312e18] write(1, "hello,world\r\n", 13) = 13 <0.000105>
  • 6 此时子进程19889调用系统函数exit_group(0) 退出进程 这个0它是进程退出状态码
  • 19889 [00007f551f2ee7f6] exit_group(0) = ? 19889 [????????????????] +++ exited with 0 +++
  • 7 父进程19510调用wait4回收退出的子进程 [{WIFEXITED(s) && WEXITSTATUS(s) == 0}] WIFEXITED 这是一个宏函数 WEXITSTATUS 拿到退出状态码
    0 退出状态码 19889 退出的子进程标识符 并且回收退出进程的内存资源 ,经过这些流程整个进程执行结束
  • 19510 [00007ffb18a0725b] <... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WSTOPPED|WCONTINUED, NULL) = 19889 <0.002737>

总结

  • 在bin/bash或者其他解释器脚本中执行可执行文件,解释器脚本会调用clone/fork生成一个子进程,父进程等待子进程退出,子进程调用execve加载ELF可执行文件(.txt、.data、.bss段以及环境表)覆盖原有的参数,随意调用_libc_start_main启动主函数,子进程执行完成后,父进程resumed等到子进程的退出状态码

标签:19889,调用,19510,strace,流程,Linux,进程,可执行程序,函数
From: https://blog.csdn.net/Arvin_emm/article/details/140417444

相关文章

  • Linux Vim最全面的教程
    前言Vim是一款强大的文本编辑器,广泛用于Linux系统中。其强大的功能和灵活的配置使得它成为许多开发者和系统管理员的首选工具。本文旨在提供一份最全面的Vim教程,帮助你从基础到高级,全面掌握这款编辑器。目录Vim简介Vim的安装基本操作常用命令高级功能配置Vim插件管理实用......
  • 阳澄湖礼券怎样兑换实物:了解阳澄湖礼券兑换实物的流程与注意事项,享受购物优惠
    ①:了解礼券信息:有效期:确认礼券的有效期,避免过期失效。使用范围:了解可以使用礼券的商家或兑换地点。面值和数量:确认礼券的面值和数量,以便兑换时使用。②:选择商品或服务:查看产品目录:在指定商家或网站上查看可以使用礼券兑换的商品或服务目录。③:兑换流程:到店......
  • Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、
    Spring的启动流程概述:核心方法:refresh方法,作用就是实例化spring容器中的所有单例。 3步:生成BeanFactory容器(有beanDefinition类信息和bean对象实例)生成BeanDefinition类信息生成bean对象实例 需要知道的知识:1、先有beanDefinition类信息,再有bean对象。2、在beanDefi......
  • WebKit简介及工作流程
    目录WebKit的架构WebKit的工作流程工作流程示意图结论WebKit是一个开源的浏览器引擎,最初由苹果公司开发,用于其Safari浏览器。它被广泛应用于许多操作系统和平台中,包括macOS、iOS、Windows和Linux。WebKit的主要功能是将HTML、CSS和JavaScript转换成可以在网......
  • Linux常用选项和指令
    目录Linux指令使用注意用户创建与删除ls指令ls指令介绍ls常见选项ls选项组合使用pwd指令Linux文件系统结构多叉树结构文件系统介绍多叉树结构文件系统的特点cd指令绝对路径相对路径cd指令介绍家户目录最近访问的目录touch指令​编辑mkdir指令mkdir指令介绍......
  • linux系统查看父子进程
    ①查找特定进程的父进程ps-opid,ppid,cmd-p1234查找进程PID为1234的父进程②显示所有进程的树状结构pstree③显示特定进程及其父进程的树状结构pstree-s1234④启动top后,按下c键可以查看完整命令,按下f键进入字段管理界面,然后选择PPID字段。⑤启......
  • linux配置用户多次登录终端失败被锁定机制
    用户登录Linux系统终端,若多次输入密码错误失败将会被锁定,被锁定期间将不能再登录系统。该机制是由于系统应用了Linux-PAM(PluggableAuthenticationModulesforLinux)可插拔认证模,是一套适用于Linux的身份验证共享库系统。设置修改/关闭锁定机制步骤:1、在终端界面输入命......
  • linux-卸载phpstudy
    需要sudo-i再用root角色去/usr/bin/phpstudy-uninstall再删掉rm-rf/usr/local/phpstudy`运行状态===========webpanelstopphpstudyrunning=安装完成==请用浏览器访问面板:外网:http://119.139.137.25:9080/9B7E96内网:http://192.168.137.128:9080/9B7E96系统初......
  • Nexpose v6.6.260 for Linux & Windows - 漏洞扫描
    Nexposev6.6.260forLinux&Windows-漏洞扫描Rapid7VulnerabilityManagement,releaseJul10,2024请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org您的本地漏洞扫描程序搜集通过实时覆盖整个网络,随......
  • HALCON 2D高精密测量项目全流程解析
    1.标定相关的任务–>>解决畸变和坐标系的转换1.1描述和查找标定对象1.2补偿透视和径向变形,径向畸变包括枕形畸变和桶形畸变1.3相机参数(内外参)1.4图像坐标到世界坐标的转换1.5自标定:不用标定板用图像四周包含直线特征进行标定1.6其他标定:一台相机标定、多台相机......