0

我试图证明程序开始使用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
4

2 回答 2

2

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

arg[1] = (char*)pint;

是错的。

您需要创建一个字符串,并将值的文本表示复制到字符串中。

就像是

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

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

于 2020-04-07T08:14:36.047 回答
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);
于 2020-04-07T10:22:19.570 回答