如何通过 exec* 传递变量
how to pass a variable via 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);
child 中的 argv[0] 总是出乎意料。
我想知道为什么它不能像我预期的那样工作。
联合并没有像您预期的那样将数字转换为其字符串表示形式。它实际做的是允许访问构成 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;
}
我想在 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);
child 中的 argv[0] 总是出乎意料。
我想知道为什么它不能像我预期的那样工作。
联合并没有像您预期的那样将数字转换为其字符串表示形式。它实际做的是允许访问构成 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;
}