【问题标题】:Pass variable arguments to newly created process将变量参数传递给新创建的进程
【发布时间】:2016-06-24 11:51:51
【问题描述】:

在 Linux 中

我有 temp.c 文件。在那我创建了新进程,我需要将所有参数传递给该进程

int main (int argc, char *argv[])
{
    if( (cid1 = fork()) == 0 ) //child1
    {
        res = execv(proc1, &argv[1]); 
    }
}

现在我编译它并运行为

./a.out "arg1 arg2 arg3"

现在我想将这个 arg1、arg2 和 arg3 传递给创建的新进程,但是当我检查 argc 时,它会显示 2 而不是 4

为什么会发生这种不匹配,在 proc1 中我只有 1 个参数,其值为 "arg1 arg2 arg3",但这里我想要 3 个参数,所以 argv[1] = arg1, argv[2]=arg2, argv[3]=arg3

如何做到这一点?

【问题讨论】:

  • 听起来您可能错误地调用了第一个程序。您是否尝试在 first 程序中打印argc?它应该是 4,但考虑到您所看到的,如果它只有 2,我不会感到惊讶。
  • 好的,这正是我所期望的。您将单个参数传递给第一个程序,即arg1 arg2 arg3。然后,您将相同的参数不变地传递给第二个程序。尝试从命令行中删除引号。这样它们将作为单独的参数传递。
  • Actulay 我需要必须使用双引号,因为在实际情况下,我有三个进程和 3 个由双引号分组的参数...
  • 好的,在这种情况下,您必须自己在程序内部解析参数。您必须创建一个新的argv,然后单独复制参数并将指针存储在新的argv 中。

标签: c linux process


【解决方案1】:

非常有用的例子 https://support.sas.com/documentation/onlinedoc/sasc/doc/lr2/execv.htm

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

main()
{
    pid_t pid;
    char *const parmList[] = {"/bin/ls", "-l", "/u/userid/dirname", NULL};

    if ((pid = fork()) == -1)
        perror("fork error");
    else if (pid == 0) {
        execv("/bin/ls", parmList);
        printf("Return not expected. Must be an execv error.n");
    }
}

如您所见, execv() 接受两个参数。第一个是可执行文件名。第二个是指向以null结尾的字符串的指针数组的指针,NULL指针用于标记数组的结束。

创建新的 char* 数组,将 proc1 分配给第一个元素(索引 0)并将所需参数分配给下一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2011-12-03
    • 2015-01-05
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多