【问题标题】:Piping a valid pointer address created in a child process to a parent process将在子进程中创建的有效指针地址通过管道传递给父进程
【发布时间】:2023-12-28 23:37:01
【问题描述】:

我是编程新手,我编写的代码执行以下操作:

  1. 在指向“int 2”的fork() 父进程中创建一个指针地址。
  2. 父进程将指针地址转换为long int,然后是字符串。
  3. 父进程将字符串写入管道。
  4. wait(NULL); 强制父进程等待子进程退出。
  5. 子进程继续将地址读入一个空字符串。
  6. 子进程将字符串转换回long int,然后转换为指针地址。
  7. 子进程尝试打印地址指向“int 2”的值。
  8. 子进程退出。
  9. 父进程恢复并将字符串转换回long int,然后将其转换回指针地址。
  10. 父进程尝试打印地址指向“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

【问题讨论】:

标签: c pointers pipe fork memory-address


【解决方案1】:

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

【讨论】:

    最近更新 更多