将在子进程中创建的有效指针地址通过管道传递给父进程
Piping a valid pointer address created in a child process to a parent process
我是编程新手,我编写了执行以下操作的代码:
- 在指向 "int 2" 的
fork()
父进程中创建一个指针地址。
- 父进程将指针地址转换为
long int
,然后是字符串。
- 父进程将字符串写入管道。
wait(NULL);
强制父进程等待子进程退出。
- 子进程继续将地址读入空字符串。
- 子进程将字符串转换回
long int
,然后转换为指针地址。
- 子进程尝试打印地址指向 "int 2" 的值。
- 子进程退出。
- 父进程恢复并将字符串转换回
long 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
简而言之,你不能那样做。来自父进程的指针不能以这种方式从子进程使用,因为这两个进程不共享相同的地址 space。您必须使用另一种方法从子到父进行通信,例如某种形式的 IPC 或文件。
我是编程新手,我编写了执行以下操作的代码:
- 在指向 "int 2" 的
fork()
父进程中创建一个指针地址。 - 父进程将指针地址转换为
long int
,然后是字符串。 - 父进程将字符串写入管道。
wait(NULL);
强制父进程等待子进程退出。- 子进程继续将地址读入空字符串。
- 子进程将字符串转换回
long int
,然后转换为指针地址。 - 子进程尝试打印地址指向 "int 2" 的值。
- 子进程退出。
- 父进程恢复并将字符串转换回
long 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
简而言之,你不能那样做。来自父进程的指针不能以这种方式从子进程使用,因为这两个进程不共享相同的地址 space。您必须使用另一种方法从子到父进行通信,例如某种形式的 IPC 或文件。