Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过exec传递变量*_C_Linux_Unix_Exec - Fatal编程技术网

如何通过exec传递变量*

如何通过exec传递变量*,c,linux,unix,exec,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; } /* ch

我想在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;
}
以下是输出: 子项:ac=2,av0:1627402297,av1:abcd

我也试着这样做:

int i;
execlp("./test", (char *)i, "abcd", (char *)0);
子对象中的argv[0]始终是意外的


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

工会没有像你期望的那样将数字转换为字符串表示形式。它实际做的是允许访问构成int的单个字节,而int不是字符串。将非字符串的字符数组传递给需要字符串的函数调用

相反,您需要使用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;
}

thx,它起作用了!但我还有一个问题,那就是工会对每个成员使用相同的记忆。当然,tv.i和tv.a是一样的,它可以像char*一样传递给exec*。我说的对吗?@ummbrellajyl联合体中的I和c字段占用相同的内存,但c不是我看起来像的字符串。假设小端字节顺序,十六进制中的12345 0x3039由字节0x39 0x30 0x0 0x0表示,这是c随后将包含的内容。这确实是一个以null结尾的字符串,并且假设ASCII编码的结果字符串实际上是90。