2016-03-05 55 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或文件。