exec系统调用

进程的执行(exec)

  • execve

    ececve系统调用可以将新程序加载到调用进程的内存空间,在这一过程中,将丢弃现有的进程的文本段,同时,进程的堆栈段,数据都会被新进程的相应部件所替换

    在执行完各种初始化代码之后(比如C++的构造函数),新的程序会从main处开始执行

    通常的使用方法是使用fork创建子进程,然后使用execve()执行新进程

    #include<unistd.h>
    int execve(const char*pathname, char *const argv[], char *const envp[])
                                                      //永远都是返回失败
    
    • 参数解析

      pathname:准备载入当前进程空间的新程序的路径名,相对或者绝对都可以

      argv:传递给新进程的命令行参数

      envp:新程序的环境列表,一般直接赋为environ

    • 进程id

      execve()调用之后,进程的ID依旧保持不变

    • 用户

      execve()调用后,会以进程的有效用户ID(effective-id)去覆盖保存用户ID(saved-id)

  • exec的各种xd

    #include<unistd.h>
    
    int execle(const char *pathname, const char *arg, ...,
              (char *)NULL, char *const envp[]);
    int execlp(const char *filename, const char *arg, ..., (char *) NULL);
    int execvp(const char* pathname, char *const argv[]);
    int execl(const char*pathname, const char *arg, ..., (char *)NULL);
                                                          //永远都是返回失败
    

    上面的...代表的是可变参数列表,即一个或多个参数,可以使用stdarg系列API进行解读

    这些系统调用可以分为3类

    1. e类

      execve,execle等,他们允许用户通过使用envp参数显式指定环境变量

    2. p类

      execlp,execvp等,他们只需要提供运行的程序名即可,系统会在环境变量PATH中来找

      如果pathname中包含'\',那么系统还是会将其视为路径名而不是文件名

    3. l类

      execlp,execl等,可以使用可变参数列表来指定参数

  • fexecve

    fexecve可以执行由文件描述符指定的程序,而不是通过路径名

    #include<unistd.h>
    int fexecve(int fd, char *const argv[], char *const envp[])
                                                      //永远返回失败
    

解释器脚本

上述系统调用其实不仅能够指定可执行文件,还能够指定脚本文件

拿shell举例:

在脚本文件的开头,往往会有着这么一行

#! /bin/bash  [附加参数]

这一行用来指定脚本文件的解释器,shell脚本当然就是指定bash了

  • 执行过程

    当使用exec()(指一系列系统调用)来运行脚本文件时,如果execve()检测到传入的文件以"#!"开头,那么他就会按照如下的参数列表来执行解释器程序

    解释器路径 [附加参数] 脚本文件路径 脚本文件参数
    

    其中脚本文件路径和脚本文件参数都是在函数的参数列表中给出的,前面的解释器路径,附加参数都是从脚本文件的首行得到的

    由上可以看出,附加参数是与解释器路径搭配使用的,比如指定/bin/bash为解释器,那么就可以使用-c,-i等参数

    注:execlp和execvp有些特殊,如果脚本文件首行没有指定解释器,那么他们会通过环境变量找到指定脚本文件后,会默认使用shell来解释

文件描述符与exec

默认情况下,有exec的调用程序所打开的所有文件描述符在exec的执行过程中会保持打开状态,且在新程序中仍然有效,这一特性确保了新执行的进程无需再次打开文件,十分有用

执行时关闭标志(FD_CLOEXEC)

从安全编程的角度出发,应该在加载新程序之前确保关闭那些不必要的文件描述符,打开文件时指定FD_CLOEXEC标志就可以做到这一点

如果设置了该标志,那么在执行exec系统调用时,会自动的关闭该文件,如果调用exec失败,那么文件描述符仍会保持打开状态

信号与exec

  • 信号处置

    调用exec时会丢弃进程的文本段,那么自然就会丢弃程序的信号处理函数,如果在调用之前对某一个信号的设置为SIG_IGN或者SIG_DFL,那么在执行exec调用后,这些信号的处置将不会改变,否则,信号处置统统都会被置为SIG_DFL

  • 掩码及等待队列

    在执行exec之后,进程的信号掩码以及pending信号的设置均得以保存

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 从整体上讲,exec系统调用创建了用户部分的地址空间。 具体地讲,做了9件事: 调用nami函数打开有名字的二进制...
    橡树人阅读 634评论 0 1
  • 引出系统编程 ============= 1.实际开发中:需要多个程序能够"同时"运行(一心多用) ...
    stalker丨阅读 1,396评论 0 0
  • 8.1 引言 在理解线程之前,首先需要了解UNIX/Linux进程。 进程是由操作系统创建的,需要相当数量的“开销...
    MachinePlay阅读 390评论 0 0
  • 前言 苦逼本科生要考试,考试还奇难内容齐多 这里我整理一下考试提纲 正好这也是对《unix环境高级编程》的前半部分...
    卡德尔先生阅读 2,244评论 9 11
  • exec 曾提及用fork函数创建新的子进程后,子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种e...
    MachinePlay阅读 1,934评论 0 0