`
gstarwd
  • 浏览: 1525441 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

exec系列系统调用

阅读更多
exec系列中的系统调用都完成相同的功能(只是参数不同而已),它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新进程。如果exec调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新的进程,但是它的进程标识符与调用进程相同。这就是说,exec没有建立一个与调用进程并发的新进程,而是用新进程取代了原来的进程。所以,在exec调用成功后,没有任何数据返回,这与fork()不同。下面给出了exec系列系统调用在linux系统库unistd.h中的函数声明:
    int execl(const char *path,const char *arg,...);
    int execlp(const char *file,const char *arg,...);
    int execle(const char *path,const chr *arg,...,char * const envp[]);
    int execv(const char *path,char * const argv[]);
    int execvp(const char *file,char * const argv[]);
    以execl()为例,execl()调用的参数均为字符型指针,第一个参数path给出了被执行的程序所在的文件名,它必须是一个有效的路径名,文件本身也必须是一个真正的可执行程序。第二个以及用省略号表示的其他参数一起组成了该程序执行时的参数表,按照linux的贯例,参数表的第一项是不带路径的程序文件名。被调用的程序可以访问这个参数表,它们相当于shell下的命令行参数。实际上,shell本身对命令的调用也是用exec调用来实现的。由于参数的个数是任意的,所以必须用一个NULL指针来标记参数表的结尾。下面给出一个使用execl调用来运行目录列表程序ls的例子:
 
  #include <stdio.h>
    #include <unistd.h>
 
    int main()
    {
        printf("executing ls\n");
        execl("/bin/ls","ls","-l",NULL);
 
        //如果execl返回,说明其调用失败
        perror("execl failed to run ls");
        exit(1);
    }

    与它类似的是execlp(),它们的主要区别是:execlp()的第一个参数指向的是一个简单的文件名,而不是一个路径名,它通过检索shell环境变量PATH指出的目录来得到该文件名的路径前缀部分。

    exec常用法:exec系统调用经常与fork()联合使用,我们可以先用fork建立一个子进程,然后在子进程中使用exec,这样就实现了父进程运行一个与其不同的子进程,并且父进程不会被覆盖。下例为fork和exec联用的例子:
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
 
    int main()
    {
        pid_t pid;
       
        pid = fork();
        if(pid < 0)
        {
            perror("fork failed");
            exit(1);
        }
        else if(0 == pid)
        {
            execl("/bin/ls","ls","-l","--color",NULL);
            perror("execl failed");
            exit(1);
        }
        else
        {
            wait(NULL);
            printf("ls completed\n");
            exit(0);
        }
       
    }
分享到:
评论

相关推荐

    操作系统实验3(2).doc

    2. **exec系列系统调用**:exec家族包括execve、execl、execlp等,它们用于在当前进程空间中替换新的程序。当使用exec调用执行shell命令时,当前进程的上下文会被新命令替代。实验中提到`exec ls`会替换当前shell,...

    UNIX Linux实验教程 3实验三Linux进程管理与控制.doc

    * exec 系列系统调用:将一个可执行的二进制文件覆盖在新进程的用户级上下文的存储空间上,以更改新进程的用户级上下文。 * wait 系统调用:等待子进程运行结束。如果子进程没有完成,父进程一直等待。 * signal ...

    unix系统的进程控制与其代码分析

    exec系列系统调用用于加载新的程序执行文件到进程地址空间,替换当前进程的映像。wait系统调用则使进程等待子进程结束,并获取子进程状态。exit系统调用使得进程终止自己,释放系统资源。 2. 代码分析:UNIX系统...

    理解UNIX进程(英).pdf

    fork调用后,可以通过使用exec系列系统调用在子进程中运行新的程序。子进程可通过wait系统调用来等待父进程对其进行管理。另外,进程可以通过命令行参数来接收初始化参数。进程还可以通过信号来控制,例如kill信号...

    Linux高性能服务器编程

    12.2.5 往事件多路分发器中注册事件 12.2.6 eventop结构体 12.2.7 event_base结构体 12.2.8 事件循环 第13章 多进程编程 13.1 fork系统调用 13.2 exec系列系统调用 13.3 处理僵尸进程 13.4 管道 13.5 信号...

    Linux进程文件1

    表中的每一项代表一个文件描述符,记录了与文件交互的相关信息,如文件描述符的控制标志(如close-on-exec,用于决定是否在执行exec系列系统调用时关闭文件描述符)以及指向系统级打开文件表的指针。文件描述符的...

    系统调用表可以作为索引使用

    ### 系统调用表的重要性及其作用 系统调用是操作系统提供给编程人员的唯一接口,使得用户程序能够请求并获得操作系统的服务。在本篇内容中,我们将详细探讨《系统调用表可以作为索引使用》这一主题的核心知识点,...

    Linux系统调用列表

    ### Linux系统调用详解 #### 一、进程控制 Linux系统调用是操作系统与应用程序之间的桥梁,它们允许用户空间的应用程序请求内核执行特定的任务。下面详细介绍与进程控制相关的系统调用。 - **fork()**: 创建一个...

    进程控制 fork函数的使用等

    统会自动回收其资源,但有时父进程需要等待子进程完成后再进行后续操作,这时就需要使用wait系统调用来实现。wait函数允许父进程挂起,直到一个子进程终止或者接收到信号,然后恢复并返回子进程的退出状态。 在实验...

    常用linux系统调用函数集合

    在Linux操作系统中,系统调用是用户空间程序与内核交互的主要途径,它们提供了一系列标准接口,用于执行底层操作,如文件I/O、进程管理、内存管理等。本集合涵盖了16篇关于常用Linux系统调用函数的文章,旨在深入...

    Linux进程控制编程-exec系列函数应用.pdf

    `exec`系列函数包括`execl`、`execle`、`execlp`、`execv`、`execvp`和`execvpe`等,它们的主要功能是加载并执行一个新的程序,而不会返回到调用点。这些函数的区别在于参数处理和环境变量的设置方式。 1. `execl`...

    fork、exec系列与system、popen区别.rar_UNIX popen_linux system pop_pop

    在UNIX和Linux操作系统中,进程创建和控制是通过一系列系统调用来实现的,其中最常见的是`fork`、`exec`系列以及`system`和`popen`函数。这些调用各自有不同的特性和用途,理解它们的区别对于进行系统级编程至关重要...

    操作系统实验(3).doc

    掌握系统调用fork( ),exec系列函数(6个),exit( ),wait( ),waitpid( ),getpid( ),getppid( )的功能和实现过程。 3. 编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一个父...

    操作系统实验报告 内容有Shell程序设计,系统调用,进程创建,进程同步

    此外,exec()系列函数用于在已存在的进程中加载新的程序映像,也是进程创建过程中的重要组成部分。 **进程同步**: 在多进程环境中,进程同步是确保多个并发进程协调执行的关键。实验中可能涉及的概念有互斥锁、...

    php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)

    这时,PHP提供了一系列内置函数,如`exec`、`system`、`passthru`和`escapeshellcmd`,允许我们调用系统命令。然而,这些功能强大的函数同时也伴随着潜在的安全风险,因此在实际应用中需谨慎使用。 `exec`函数用于...

    java执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec

    `ProcessBuilder`类用于创建操作系统进程,每个`ProcessBuilder`实例管理一系列进程属性,通过`start()`方法创建一个新的`Process`实例。 **代码示例** ```java import java.io.BufferedReader; import java.io....

    了解与进程控制相关的各种系统调用,加深对进程的状态变迁与进程调度的理解

    本实验主要关注与进程控制相关的四个关键系统调用:`fork`、`exec`、`exit`和`wait`,以帮助理解进程的状态变迁和调度。 1. **fork系统调用**: `fork()`用于创建一个新的进程,即父进程的副本。在调用`fork()`后...

    5_Process API (fork, wait, and exec).pptx

    `exec`系列的系统调用(如`execvp`)用于替换当前进程的内存映像,使进程执行新的程序。在示例中,`execvp`被用来执行`Program B`,替换掉原来的`Program A`的执行流。如果`exec`成功,程序将不会返回到调用它的代码...

    20120618_启动新进程(fork和exec系列函数实现)1

    `fork()`函数是Unix和类Unix系统(如Linux)中用于创建新进程的关键系统调用。它会创建一个与调用进程几乎完全一样的副本,被称为子进程。这两个进程拥有相同的代码、全局变量、环境变量以及打开的文件描述符,但...

Global site tag (gtag.js) - Google Analytics