精华内容
下载资源
问答
  • execv函数

    2020-08-20 21:56:04
    exec函数有六个但是实际上掌握好一个自己熟悉的就好了,因为他们作用都是一样的,我在这里最喜欢用的是execv,所以就只讨论这个函数的用法。      期间代码要和fork交相使用,fork有两个返回值,父...

         exec函数有六个但是实际上掌握好一个自己熟悉的就好了,因为他们作用都是一样的,我在这里最喜欢用的是execv,所以就只讨论这个函数的用法。

         期间代码要和fork交相使用,fork有两个返回值,父进程返回子进程的pid,子进程返回0,因为子进程可以用getppid()知道父进程的pid(父进程唯一是这个理论的支持),而父进程可以拥有多个子进程,所以无法用函数去单纯获得子进程pid。

          函数原型

          #include <unistd.h>

          int exevc(const char *pathname,char *const argv[]);

          关于argv里面的参数,之前我一直有所疑惑,先用一个简单的代码看看如果这样写里面会有什么::

    #include <unistd.h>

    #include <stdio.h>

    int main(int argc,char* argv[])
    {
      printf("argv[0]::%s\n",argv[0]);
      printf("argv[1]::%s\n",argv[1]);
      printf("argv[2]::%s\n",argv[2]);
      execv("/bin/ls",argv);
      return 0;
    }


          运行结果和使用方法::

    截图有点不清晰但是不影响观看,可以看出argv的结尾一定是空指针,而里面存放的就是命令要调用的参数。


    以下是我对第二个参数进行的测试:

    #include <unistd.h>
    #include <stdio.h>


    int main(int argc,char* argv[])
    {
      char *my[3] = {0};
      my[0] = "nihao";
      my[1] = "-l";
      //my[2]空指针
      execv("/bin/ls",my);
      return 0;
    }

    运行结果:


    可见运行结果并没有受到影响,所以可以得出结论


    关于execv的第二个参数数组,他的第一个位置存放的东西对于程序没有影响(但是应该存应用程序名字本身,可是我发现里面不管放什么都不影响程序结果所以得出这个结论,因为我不知道它放程序名字的意义何在),但是第二个及第二个以后存放的就是她应该使用的参数,最终结尾是空指针。




    展开全文
  • execl execv

    2019-07-10 22:33:44
    功 能: 装入并运行其它程序的 函数 用 法: int execv(const char *pathname, char * const argv[]); 环境 linux unix 表头文件 unistd.h 举例 char *exec_argv[4]; exec_argv[0] = ip; exec_argv[1] =...
    int execl(const char *path, const char *arg, ...);

    函数说明

    execl()其中后缀"l"代表list也就是参数列表的意思 第一参数path字符指针所指向要执行的文件路径 接下来的参数代表执行该文件时传递的参数列表 argv[0],argv[1]... 最后一个参数须用空指针NULL作结束

    2函数用法

    函数返回值

    成功则不返回值 失败返回-1 失败原因存于errno中 可通过perror()打印
    Windows下示例(vs编译)
    #include <stdio.h>
    #include <process.h>
    int main()
    {
    printf("调用D盘Test目录下的hello.exe, 第一个参数为改应用程序的名称\n");
    execl("D:\\Test\\hello.exe","hello");
    printf("进程已经被递交给了hello.exe 这里不会再执行");
    }
    Linux下示例

    示例1

    /* 执行 /bin/ls -al /ect/passwd */
    #include <unistd.h>/*** File: execl.c**/
    main()
    {
    // 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为"-al", 第三个参数为"/etc/passwd"
    execl("/bin/ls", "ls", "-al", "/etc/passwd", (char *) 0);
    }

    示例2

    #include <unistd.h>/*** File: execl.c**/
    int main()
    {
    char args[]=" -l";
    // 执行/bin目录下的ls, 第一参数为程序名ls, 第二个参数为"-al", 第三个参数为"/etc/"
    execl("/bin/ls","ls","-al","/etc/",NULL);
    return 0;
    }

    编译并运行

    [cnscn@test c]$ gcc execl.c -o execl
    [cnscn@test c]$ ./execl
    -rw-r--r-- 1 root root 2218 Jan 13 11:36 /etc/passwd
     
     
     
    函数名: execv
    功 能: 装入并运行其它程序的 函数
    用 法: int execv(const char *pathname, char * const argv[]);
    环境 linux unix
    表头文件 unistd.h
    举例
    char *exec_argv[4];
    exec_argv[0] = ip;
    exec_argv[1] = port;
    exec_argv[2] = NULL;
    if (execv("/bin/telnet", exec_argv) == -1)
    {
    DoDisconnect();
    CheckError(nResult, etTelnetConnect, "Connect");
    }

    转载于:https://www.cnblogs.com/jeanschen/p/3512609.html

    展开全文
  • 关于execv函数

    万次阅读 2016-07-17 15:23:21
    exec函数有六个但是实际上掌握好一个自己熟悉的就好了,因为他们作用都是一样的,我在这里最喜欢用的是execv,所以就只讨论这个函数的用法。  期间代码要和fork交相使用,fork有两个返回值,父进程返回子进程的pid...

         exec函数有六个但是实际上掌握好一个自己熟悉的就好了,因为他们作用都是一样的,我在这里最喜欢用的是execv,所以就只讨论这个函数的用法。

         期间代码要和fork交相使用,fork有两个返回值,父进程返回子进程的pid,子进程返回0,因为子进程可以用getppid()知道父进程的pid(父进程唯一是这个理论的支持),而父进程可以拥有多个子进程,所以无法用函数去单纯获得子进程pid。

          函数原型

          #include <unistd.h>

          int exevc(const char *pathname,char *const argv[]);

          关于argv里面的参数,之前我一直有所疑惑,先用一个简单的代码看看如果这样写里面会有什么::

    #include <unistd.h>

    #include <stdio.h>

    int main(int argc,char* argv[])
    {
      printf("argv[0]::%s\n",argv[0]);
      printf("argv[1]::%s\n",argv[1]);
      printf("argv[2]::%s\n",argv[2]);
      execv("/bin/ls",argv);
      return 0;
    }


          运行结果和使用方法::

    截图有点不清晰但是不影响观看,可以看出argv的结尾一定是空指针,而里面存放的就是命令要调用的参数。


    以下是我对第二个参数进行的测试:

    #include <unistd.h>
    #include <stdio.h>


    int main(int argc,char* argv[])
    {
      char *my[3] = {0};
      my[0] = "nihao";
      my[1] = "-l";
      //my[2]空指针
      execv("/bin/ls",my);
      return 0;
    }

    运行结果:


    可见运行结果并没有受到影响,所以可以得出结论


    关于execv的第二个参数数组,他的第一个位置存放的东西对于程序没有影响(但是应该存应用程序名字本身,可是我发现里面不管放什么都不影响程序结果所以得出这个结论,因为我不知道它放程序名字的意义何在),但是第二个及第二个以后存放的就是她应该使用的参数,最终结尾是空指针。




    展开全文
  • 程序运行过程(1)在内存中划出一片内存空间(2)将硬盘上可执行文件中的代码(机器指令)拷贝到会出的内存空间空间中(3)pc指向第一条指令,cpu取指运行当有os时,以上过程都是通过调用相应的api来实现的。在linux下,os...

    程序的运行过程

    (1)在内存中划出一片内存空间

    (2)将硬盘上可执行文件中的代码(机器指令)拷贝到会出的内存空间空间中

    (3)pc指向第一条指令,cpu取指运行

    当有os时,以上过程都是通过调用相应的api来实现的。在linux下,os提供2个非常关键的api,fork和exec。

    fork:开辟出一块内存空间

    exec:将程序代码(机器指令)拷贝到开辟的内存空间中,并让pc指向第一条指令,cpu开始运行,进程就运行起来了,运行起来的进程会与其它的进程切换着并发运行

    fork

    #include

    pid_t fork(void);

    (1)功能:从调用该函数的进程复制出子进程,被复制的被称为父进程,复制出来的进程称为子进程。复制后有2个结果:

    1)依照父进程内存空间的样子,原样复制地开辟出子进程的内存空间

    2)由于子进程的空间是原样复制的父进程空间,因此子进程内存空间中的代码和数据和父进程的完全相同

    其实复制父进程的主要目的,就是为了复制出一块内存空间。只不过复制的附带效果是,子进程原样的拷贝了一份父进程的代码和数据,事实上复制出子进程内存空间的主要目的其实是为了exec加载新的程序代码。

    (2)返回值

    由于子进程原样复制了父进程代码,因此父子进程都会执行fork函数(暂定)

    1)父进程的fork,成返回子进程的Pid,失败返回-1

    2)子进程的fork,成功返回0 ,失败-1

    复制原理:linux有虚拟内存机制,所以父进程是运行在虚拟内存上的,虚拟内存是os通过数据结构基于物理内模拟出来的,因此底层对应的还是物理内存。复制子进程时,会复制父进程的虚拟内存数据结构,那么就得到了子进程的虚拟内存,相应的底层会对应着一片新的物理内存空间,里面放了与父进程一模一样的代码和数据。

    exec

    父进程fork复制出子进程的内存空间后,子进程内存空间的代码和数据和父进程是相同的,这样没有太大的意义,我们需要在子进程空间里面运行全新的代码,这样才有意义。

    exec函数族:execve是系统函数,其它的execl、execv、execle、execlp、execvp都是基于execve封装得到的库函数。

    execve函数原型

    #include

    int execve(const char *filename, char **const argv, char **const envp);

    (1)功能:向子进程空间加载新程序代码(编译后的机器指令)。

    (2)参数:

    1)filename:新程序(可执行文件)所在的路径名

    2)argv:传给main函数的参数,比如我可以将命令行参数传过去

    3)envp:环境变量表

    (3)返回值:函数调用成功不返回,失败则返回-1,且errno被设置

    7479e019afec

    fork和exec

    exec的作用:将新程序代码加载(拷贝)到子进程的内存空间,替换掉原有的与父进程一模一样的代码和数据,让子进程空间运行全新的程序。

    在Linux中使用exec函数族主要有以下两种情况:

    a. 当进程认为自己不能再为系统和用户做出任何贡献时,就可以调用任何exec 函数族让自己重生。

    b. 如果一个进程想执行另一个程序,那么它就可以调用fork函数新建一个进程,然后调用任何一个exec函数使子进程重生。

    system

    system库函数封装了fork和execve函数,调用时会自动的创建子进程空间,并把新程序的代码加载到子进程空间中,然后运行起来。

    #include

    int system(const char *command);

    (1)功能:创建子进程,并加载新程序到子进程空间,运行起来

    (2)参数:新程序的路径名

    (3)代码演示

    system("ls");

    system("ls -al");

    展开全文
  • 摘要:本文主要讲述如何在进程中运行新代码,以及exec系列函数... 用函数fork创建子进程后,如果希望在当前子进程中运行新的程序,可以调用exec函数执行另一个程序.当进程调用exec函数时,该进程用户空间资源(正文
  • Linux下使用system()和execv()实现对外部程序的调用system()函数system()函数的原型为:#include int system(const char *__command);system()函数调用/bin/sh来执行参数指定的命令,/bin/sh一般是一个软连接,...
  • system()与execv()函数使用详解 2012-12-05 12:12 by Rudrj2, 22772 阅读, 0 评论, 收藏, 编辑 在网上搜了很久都没有一个很好的解释,都只说了一方面system调用子进程后继续执行父进程,execv是调用一个新的进程.....
  • sys_execv源码分析

    千次阅读 2017-02-01 16:19:31
    sys_execv do_execve do_execveat_common load_elf_binary 程序装载,解释器
  • vfork fork clone execv

    2020-07-03 20:27:33
    exec 创建一个全新的程序运行环境, 之前的进程还在, 并不是exec出来的进程环境覆盖了原先的进程环境. https://www.cnblogs.com/noble/p/4144247.html https://my.oschina.net/cnyinlinux/blog/422207
  • vfork&&execv()实现在程序中加载可执行程序:   分析过程::::::::::::::::  /*  任务: 编写一个程序能在程序中执行shell 命令。  或执行 bash 命令。 我在/home/code/file1/这个目录下...
  • 5进程原语 execl execlp execle execv execvp execvp ex
  • 在这里我们首先理解Shell怎么执行程序,学习相关知识(什么是进程、如何创建进程、如何运行程序),然后实现这个功能,这样一个简单的Shell就诞生了(我把这个Shell叫A Shell,简称ash)。什么是进程 
  • system()与execv()函数使用详解

    千次阅读 2014-02-27 14:26:32
    在网上搜了很久都没有一个很好的解释,都只说了一方面system调用子进程后继续执行父进程,execv是调用一个新的进程,所以打算自己读读这两个执行文件源码,自己再找找其他不同: 相关函数: fork,execl,...
  • } else if(pid==0)//子进程 { printf("子进程:%d,运行结束\n",getpid()); exit(0); } } 孤儿进程: 父进程先于子进程退出 (应用于精灵进程/守护进程/后台进程) PS:由于父进程先于子进程退出,所以该子进程...
  • execv execve execvp 简单记忆法: exec执行新进程 l 用参数列表的方式,最后一个参数时NULL v 把2参数放在数组内,数组最后一个值是NULL e 用心的环境变量,最后一个是存放新的环境变量的字符串数组 ...
  • int main(int argc, char *argv[], char *envp[]) 参数argc指出了运行程序时命令行参数的个数,数组argv存放了所有的命令行参数,数组envp存放了所有的环境变量。 环境变量指的是一组值,从用户登录后就一直存在...
  • 在进程中执行新代码 execl、execle、execlp、execv、execve和execvp函数 ... 用函数fork创建子进程后,假设希望在当前子进程中运行新的程序,能够调用exec函数运行还有一个程序.当进程调用exec函...
  • exec关联函数组(execl、execlp、execle、execv、execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。 ...
  • 06-15 10:21:30.221 23120-23120/? I/art: Late-enabling -Xcheck:...06-15 10:21:30.327 23120-23120/com.xx.xxx W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable...
  • exec族函数exec族函数的作用[^1]exec族函数的定义函数原型:exac函数归为带l、带p、带v、带e 四类来说明参数特点一、带l的一类exac函数(l表示list),包括execl、execlp、execle,要求将新程序的每个命令行参数都...
  • 1.exec族函数函数的作用: 我们用fork函数创建新进程后,经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时,该... exec函数族分别是:execl, execlp, execle, execv, execvp, execvpe 函数
  •  1.exec族依赖的头文件 ...//第二个参数:可执行程序运行时所需的参数,这里是一个可变参数,每个参数之间用逗号分割 //参数结束时,最后一个参数是:NULL int execl(constchar *path, const cha
  • 进程概述 ... 进程是程序的执行实例, 包括程序计数器、 寄存器和变量的当前值 程序是静态的, 进程是动态的 程序是一些指令的有序集合, 而进程是程序执行的过程 进程的状态是变化的, 其包括...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,086
精华内容 2,434
关键字:

execv运行程序