• unix exec族函数 关于参数的疑惑


    问题不出在这几个函数,而在于看后文解释器的时候发现一个很奇妙的问题。 

    #include <unistd.h>
    
    int execl(const char *pathname, const char *arg0, 
    ... /* (char *)0 */ );
    
    int execv(const char *pathname, char *const argv []);
    
    int execle(const char *pathname, const char *arg0, ...
               /* (char *)0,  char *const envp[] */ );
    
    int execve(const char *pathname, char *const
     argv[], char *const envp []);
    
    int execlp(const char *filename, const char *arg0,
     ... /* (char *)0 */ );
    
    int execvp(const char *filename, char *const argv []);
    

     第一参数是路径名或者文件名, 后续的是一连串字符串参数或者指针数组。来研究一下文中的小程序。

    #include "apue.h"
    #include <sys/wait.h>
    
    char    *env_init[] = { "USER=unknown", "PATH=/tmp", NULL };
    
    int
    main(void)
    {
        pid_t   pid;
    
        if ((pid = fork()) < 0) {
            err_sys("fork error");
        } else if (pid == 0) {  /* specify pathname, specify environment */
            if (execle("/home/sar/bin/echoall", "echoall", "myarg1",
                    "MY ARG2", (char *)0, env_init) < 0)
                err_sys("execle error");
        }
    
        if (waitpid(pid, NULL, 0) < 0)
            err_sys("wait error");
    
        if ((pid = fork()) < 0) {
            err_sys("fork error");
        } else if (pid == 0) {  /* specify filename, inherit environment */
            if (execlp("echoall", "echoall", "only 1 arg", (char *)0) < 0)
                err_sys("execlp error");
        }
    
        exit(0);
    }
    #include "apue.h"
    
    int
    main(int argc, char *argv[])
    {
        int         i;
        char        **ptr;
        extern char **environ;
    
        for (i = 0; i < argc; i++)      /* echo all command-line args */
            printf("argv[%d]: %s
    ", i, argv[i]);
    
        for (ptr = environ; *ptr != 0; ptr++)   /* and all env strings */
            printf("%s
    ", *ptr);
    
        exit(0);
    }

     对于:

    execle("/home/sar/bin/echoall", "echoall", "myarg1",
                    "MY ARG2", (char *)0, env_init)
    的调用,感性的判断认为,应该是将 echoall myarg1 MY ARG2三个参数传给 echoall 那么,加上函数本身,应该是有四个参数,然而结果却不是如此。
    输出的结果是:
      argv[0]: echoall
      argv[1]: myarg1
      argv[2]: MY ARG2
    为何argv[0]会变成了传入的第二个参数呢。百度很多说得都不是很明白。中文版,习惯了联系上下文阅读而不仔细查看字眼,翻看英文版看到仔细的阅读了一下。

    Note also that we set the first argument, argv[0] in the new program, to be the filename component of the pathname.
    Some shells set this argument to be the complete pathname. This is a convention only.
    We can set argv[0] to any string we like.

    exec参数的第一个参数是路径,将第二个参数设置为新程序的argv[0],这是第一参数,路径名的分量。某些shell把这个参数设置为完整的路径,只是为了方便。我们可以设置argv[0],第二个参数为任意值。

    可是,这是为什么呢。
  • 相关阅读:
    python 配置环境变量无效问题
    vscode 快捷隐藏node_modules目录
    qs 格式化
    webstorm vue 格式化 script 最外层缩进问题
    electron-vue static静态目录
    解决VS Code安装golang相关插件失败问题
    linux云机器快速部署备忘录
    添加用户(过火绒)
    hvv面试题
    comsvcs.dll转储lsass(过360卫士&火绒)
  • 原文地址:https://www.cnblogs.com/dieangel/p/5616938.html
Copyright © 2020-2023  润新知