-1
我是新来的编程有效的指针地址,和我做了代码执行以下操作:配管,子进程创建的父进程
- 在
fork()
父进程,点创建一个指针地址到“int 2”。 - 父进程转换指针地址到
long int
,然后一个字符串。 - 父进程将字符串写入管道。
wait(NULL);
迫使父进程等待子进程退出。- 子进程继续将地址读入空字符串。
- 子进程的字符串转换回
long int
,然后进入一个指针地址。 - 子进程尝试打印地址指向“int 2”的值。
- 子进程退出。
- 父进程恢复和字符串转换回
long int
,然后把它转换回指针地址。 - 父进程试图打印的值,该地址指向“INT 2”
结果是父进程接收从一个字符串转换的地址,并成功地打印“2”。子进程在父进程之前收到完全相同的地址,但该地址包含垃圾,因为它会打印“0”。在整个过程中始终贯穿着命令,以确保原始地址保持完整。
以下是相关的代码。输出放在代码之后。请注意,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
进程具有不同的地址空间。 – Olaf
请参阅[这是关于如何共享内存之间父母和孩子,例如'mmap'](http://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork) –
地址不能在过程之间以这种方式交换。此外,地址可能不适合'long int'类型,并且确实不适用于Windows 64位。你应该使用'uintptr_t'。 – chqrlie