【问题标题】:What happens to the arguments passed to execve?传递给 execve 的参数会发生什么?
【发布时间】:2016-02-14 20:02:17
【问题描述】:

我知道调用execve会彻底清除调用程序的文本、数据、bss和堆栈,并用被调用程序的替换。

我的问题是这样的:

如果我们将分配在堆上的char 数组作为参数之一传递给execve,会发生什么? char * 本身驻留在堆栈上,但所有单独的 chars 都在堆上。 execve 不会擦除这些数据吗?新程序将如何接收它的参数?

【问题讨论】:

    标签: c exec system


    【解决方案1】:

    execve 系统调用将复制 args 并将它们放在新程序的地址空间中。

    您可以在此处的第 1586 行看到此内容

    1581         bprm->exec = bprm->p;
    1582         retval = copy_strings(bprm->envc, envp, bprm);
    1583         if (retval < 0)
    1584                 goto out;
    1585 
    1586         retval = copy_strings(bprm->argc, argv, bprm);
    1587         if (retval < 0)
    1588                 goto out;
    1589 
    1590         retval = exec_binprm(bprm);
    1591         if (retval < 0)
    1592                 goto out;
    

    (来自http://lxr.free-electrons.com/source/fs/exec.c

    【讨论】:

    • 所以它执行深拷贝?谢谢!
    • 是的,它复制每个 argv (和 envp) 字符串的内容。
    • 顺便说一句,copy_strings() 函数从我包含的那个链接中的第 454 行开始——这是一个非常复杂的函数。
    猜你喜欢
    • 1970-01-01
    • 2012-01-03
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多