-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