C 将在子进程中创建的有效指针地址管道化到父进程

C 将在子进程中创建的有效指针地址管道化到父进程,c,pointers,pipe,fork,memory-address,C,Pointers,Pipe,Fork,Memory Address,我是编程新手,我编写了以下代码: 在fork()父进程中创建指向“int 2”的指针地址 父进程将指针地址转换为长int,然后转换为字符串 父进程将字符串写入管道 wait(空)强制父进程等待子进程退出 子进程继续将地址读入空字符串 子进程将字符串转换回long int,然后转换成指针地址 子进程尝试打印地址指向“int 2”的值 子进程退出 父进程继续并将字符串转换回长int,然后将其转换回指针地址 父进程尝试打印地址指向“int 2”的值 结果是父进程收到从字符串转换的地址,并成功打印“2”

我是编程新手,我编写了以下代码:

  • fork()
    父进程中创建指向“int 2”的指针地址
  • 父进程将指针地址转换为
    长int
    ,然后转换为字符串
  • 父进程将字符串写入管道
  • wait(空)强制父进程等待子进程退出
    
  • 子进程继续将地址读入空字符串
  • 子进程将字符串转换回
    long int
    ,然后转换成指针地址
  • 子进程尝试打印地址指向“int 2”的值
  • 子进程退出
  • 父进程继续并将字符串转换回
    长int
    ,然后将其转换回指针地址
  • 父进程尝试打印地址指向“int 2”的值
  • 结果是父进程收到从字符串转换的地址,并成功打印“2”。子进程接收的地址与父进程接收的地址完全相同,但该地址包含垃圾邮件,因为它打印“0”<代码>printf
    命令贯穿始终,以确保原始地址在整个过程中保持不变

    以下是相关代码。输出放在代码后面。请注意,
    WAIT(400)
    只是一个循环,使子进程等待父进程将地址写入管道。我在别处定义了它,它不与任何其他函数交互

    int main(void) {
        int s[2];
        pipe(s);
        int pid;
        long nbytes;
        char buffer[80];
        pid = fork();
        if (pid == -1) {
            perror("fork failed");
            exit(EXIT_FAILURE);
        }
        if (pid == 0) {
            close(s[1]);
            WAIT(200);
            nbytes = read(s[0], buffer, sizeof(buffer));
            printf("%s\n", buffer);
            int *q = stringToAdress(buffer);
            printf("%ld\n", q);
            printf("%d\n", *q);
        } else {
            close(s[0]);
            int *p = malloc(sizeof(int));
            *p = 2;
            printf("%ld\n", p);
            char *str = addressToString(p);
            printf("%s\n", str);
            write(s[1], str, (strlen(str) + 1));
            wait(NULL);
            int *q = stringToAdress(str);
            printf("%ld\n", q);
            printf("%d\n", *q);
            free(p);
            exit(EXIT_SUCCESS);
        }
    }
    
    以下是输出。我相信除了
    0
    之外,一切都是可以期待的。我不知道为什么它不是
    2

    4301258912
    4301258912
    4301258912
    4301258912
    0
    4301258912
    2
    

    程序以退出代码结束:
    0

    简而言之,您不能这样做。父进程的指针在子进程中不可用,因为这两个进程不共享相同的地址空间。您必须使用另一种方法从子进程到父进程进行通信,例如某种形式的IPC或文件。

    进程有不同的地址空间。请参阅进程之间不能以这种方式交换地址。此外,地址可能不适合类型
    long int
    ,实际上也不适合Windows 64位。您应该使用
    uintptr\t