如何在C中使用exec argv传递指针?

问题描述 投票:0回答:2

我试图证明使用exec启动的程序无法取消引用继承的指针,但是我的指针看起来有所不同。这是故意的吗?

p1.c:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

void main()
{
    int *pint = malloc(sizeof(int));
    *pint = 25;
    printf("[main] pint: @%p = %d\n", pint, *pint);

    int h = fork();

    if(h == 0) {
        (*pint)++;
        printf("[fork] pint: @%p = %d\n", pint, *pint);
        char *fname="./p2";
        char *arg[3];
        arg[0] = "./p2";
        arg[1] = (char*)pint;
        arg[2] = NULL;
        printf("[fork] arg1: @%p = %d\n", arg[1], *arg[1]);
        execvp(fname, arg);
    } else {
        sleep(1);
        printf("[main] pint: @%p = %d\n", pint, *pint);
    }

}

p2.c:

#include <stdio.h>

int main(int argc,void *argv[])
{
    printf("[ p2 ] arg1: @%p\n", argv[1]);
}

这是我得到的示例输出:

$ ./p1
[main] pint: @0x55de8f6db260 = 25
[fork] pint: @0x55de8f6db260 = 26
[fork] arg1: @0x55de8f6db260 = 26
[ p2 ] arg1: @0x7ffe13b9fc65 // <--- mismatch
[main] pint: @0x55de8f6db260 = 25
c pointers exec
2个回答
2
投票

您传递的参数必须为字符串。这意味着

arg[1] = (char*)pint;

是错误的。

您需要创建一个字符串,然后将值的文本表示形式复制到该字符串中。

类似

char arg1[64];
snprintf(arg1, sizeof arg1, "%d", *pint);
arg[1] = arg1;

要求参数是字符串也意味着void *argv[]也错误。


0
投票

正如kaylum,rici和一些编程人员所提到的,需要将指针转换为字符串,然后将该字符串转换回指针以完成此操作,所以:

p1.c:

char arg1[64];
snprintf(arg1, sizeof arg1, "%p", pint);
printf("[fork] arg1: @%s\n", arg1);

arg[0] = "./p2";
arg[1] = arg1;
arg[2] = NULL;

p2.c:

unsigned long long int *pint;
pint = (int*)strtoull(argv[1], NULL, 16);
© www.soinside.com 2019 - 2024. All rights reserved.