zoukankan      html  css  js  c++  java
  • Linuxexec函数族及system函数

    exec函数族包括6个函数:

    #include
    int execl(const char *path, const char *arg, ...);
    int execlp(const char *file, const char *arg, ...);
    int execle(const char *path, const char *arg, const char *envp[]);
    int execv(const char *path, const char *argv[]);
    int execve(const char *path, const char *argv[], const char *envp[];
    int execvp(const char *file, const char *argv[]);


    参数说明:

    execl的第一个参数是包括路径的可执行文件,后面是列表参数,列表的第一个为命令path,接 着为参数列表,最后必须以NULL结束。
    execlp的第一个参数可以使用相对路径或者绝对路径。
    execle,最后包括指向一个自定义环境变量列表的指针,此列表必须以NULL结束。
    execv,v表示path后面接收的是一个向量,即指向一个参数列表的指针,注意这个列表的最后 一项必须为NULL。
    execve,path后面接收一个参数列表向量,并可以指定一个环境变量列表向量。
    execvp,第一个参数可以使用相对路径或者绝对路径,v表示后面接收一个参数列表向量。

    exec被调用时会替换调用它的进程的代码段和数据段(但是文件描述符不变),直接返回到调用它的进程的父进程,如果出错,返回-1并设置errno。


    例子:
    #include
    int main(int argc, char *argv[])
    {
    char *envp[]={"PATH=/tmp", "USER=lei", "STATUS=testing", NULL};
    char *argv_execv[]={"echo", "excuted by execv", NULL};
    char *argv_execvp[]={"echo", "executed by execvp", NULL};
    char *argv_execve[]={"env", NULL};
    if(fork()==0) {
    if(execl("/bin/echo", "echo", "executed by execl", NULL)<0)
    perror("Err on execl");
    }
    if(fork()==0) {
    if(execlp("echo", "echo", "executed by execlp", NULL)<0)
    perror("Err on execlp");
    }
    if(fork()==0) {
    if(execle("/usr/bin/env", "env", NULL, envp)<0)
    perror("Err on execle");
    }
    if(fork()==0) {
    if(execv("/bin/echo", argv_execv)<0)
    perror("Err on execv");
    }
    if(fork()==0) {
    if(execvp("echo", argv_execvp)<0)
    perror("Err on execvp");
    }
    if(fork()==0) {
    if(execve("/usr/bin/env", argv_execve, envp)<0)
    perror("Err on execve");
    }
    }

    程序里调用了2 个Linux 常用的系统命令,echo和env。echo会把后面跟的命令行参数原封不动的打印出来,env用来列出所有环境变量。
    由于各个子进程执行的顺序无法控制,所以有可能出现一个比较混乱的输出--各子进程打印的结果交杂在一起,而不是严格按照程序中列出的次序。
    最常见的错误:
    平时的编程中,如果用到了exec 函数族,一定记得要加错误判断语句。因为与其他系统调用比起来,exec很容易受伤,被执行文件的位置,权限等很多因素都能导致该调用的失败。
    最常见的错误是:
    1)找不到文件或路径,此时errno 被设置为ENOENT;
    2)数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT;
    3)没有对要执行文件的运行权限,此时errno被设置为EACCES。


    system函数:
    原型:
    #include
    int system (const char *string);
    功能:
    The system function runs the command passed to it as
    string and waits for it to complete. The command is
    executed as if the command $ sh −c string has been given
    to a shell.
    【也就是说,system要使用一个shell来启动指定的程序】


    例:
    #include
    #include
    int main()
    {
    printf("Running ps with system\n");
    system("ps −ax");
    printf("Done.\n");
    exit(0);
    }

  • 相关阅读:
    Codeforces Round #297 (Div. 2) 525C Ilya and Sticks(脑洞)
    全栈必备 JavaScript基础
    2014-04-19编程之美初赛题目及答案解析
    doT js模板入门 2
    一篇关于arc下内存管理的老文章,包含各种冷门修饰符(关于内存),写的较好,mark
    MyBatis官方教程及源代码解析——mapper映射文件
    Android中图片的三级缓存策略
    python字符串/元组/列表/字典互转
    关于字节对齐的理解
    阿里云服务器ecs配置之安装redis服务
  • 原文地址:https://www.cnblogs.com/jasonliu/p/2226526.html
Copyright © 2011-2022 走看看