如何通过exec *

时间:2018-04-11 01:24:30

标签: c linux unix exec

我想在exec *

之后将一个int变量传递给另一个进程

这是我的代码:

typedef union{
    int i;
    char c[4];
}t_t;

/* parent */
int main(int ac, char *av[])
{
    t_t tv;

    tv.i = 12345;

    if(fork() == 0)
        execlp("./test", tv.c, "abcd", (char *)0);
    return 0;
}

/* child */
int main(int ac, char *av[])
{
    t_t tv;

    memcpy(tv.c, av[0], sizeof(int));

    printf("child: ac=%d, av0: %d, av1: %s\n", ac, tv.i, av[1]);
    return 0;
}

这里是输出:
child:ac = 2,av0:1627402297,av1:abcd

我也尝试这样:

int i;
execlp("./test", (char *)i, "abcd", (char *)0);

孩子中的argv [0]始终是意料之外的。

我想知道为什么它能像我预期的那样工作。

1 个答案:

答案 0 :(得分:1)

联合并没有像您期望的那样将数字转换为其字符串表示形式。它实际上做的是允许访问构成int的单个字节,而不是字符串。将不是字符串的字符数组传递给期望字符串的函数会调用undefined behavior

您想要的是使用snprintf将整数转换为字符串并将该字符串传递给execlp。然后在子进程中,使用atoi将字符串转换回整数。

/* parent */
int main(int argc, char *argv[])
{
    char str[50];
    snprintf(str, sizeof(str), "%d", 12345);

    if(fork() == 0)
        execlp("./test", str, "abcd", (char *)0);
    return 0;
}

/* child */
int main(int argc, char *argv[])
{
    int i = atoi(argv[0]);

    printf("child: argc=%d, argv0: %d, argv1: %s\n", argc, i, argv[1]);
    return 0;
}