2016-03-05 78 views
-1

我是新來的編程有效的指針地址,和我做了代碼執行以下操作:配管,子進程創建的父進程

  1. fork()父進程,點創建一個指針地址到「int 2」。
  2. 父進程轉換指針地址到long int,然後一個字符串。
  3. 父進程將字符串寫入管道。
  4. wait(NULL);迫使父進程等待子進程退出。
  5. 子進程繼續將地址讀入空字符串。
  6. 子進程的字符串轉換回long int,然後進入一個指針地址。
  7. 子進程嘗試打印地址指向「int 2」的值。
  8. 子進程退出。
  9. 父進程恢復和字符串轉換回long int,然後把它轉換回指針地址。
  10. 父進程試圖打印的值,該地址指向「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

+3

進程具有不同的地址空間。 – Olaf

+1

請參閱[這是關於如何共享內存之間父母和孩子,例如'mmap'](http://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork) –

+0

地址不能在過程之間以這種方式交換。此外,地址可能不適合'long int'類型,並且確實不適用於Windows 64位。你應該使用'uintptr_t'。 – chqrlie

回答

1

總之,你不能這樣做。來自父進程的指針不能以這種方式從子進程使用,因爲這兩個進程不共享相同的地址空間。您必須使用另一種方法進行從小孩到父母的溝通,例如某種形式的IPC或文件。