0

我曾问过关于跨内存附加的问题(跨内存附加。如何将远程地址从子进程获取到父进程

我正在使用管道将地址从子进程传输到父进程。代码:

#include <stdio.h>
#include <sys/uio.h>
#include <sys/types.h> 
#include <unistd.h> 
#include <string.h>

int main()
{
int i, nbytes;  //nbytes to keep a count of the no. of bytes received
int fd[2];  //file descriptor
int pid1, ppid;
char temp;  
char string[] = "hello world\n";
char *readbuffer = NULL;

int address;

ppid = getpid();
printf("I am the parent process pid : %d \n", ppid);

pipe(fd);
pid1 = fork(); //child A

if(pid1 == -1){
    perror("fork");
    return 1 ;
}

if(pid1 == 0){ //body of the child process
    readbuffer = string;
    printf("child process A with pid : %d\n",getpid());
    printf("Address of the string : %p\n", readbuffer);
    //snprintf(string, 80,"%p\n",address);
    close(fd[0]);
    write(fd[1], readbuffer, sizeof(readbuffer));
} else {
    printf("I am the parent : %d\n", getpid());
    close(fd[1]);
    nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
    printf("The address of the rcvd buffer : %s\n", readbuffer);
}

return 0;

}

父级从“readbuffer”指针中的子级接收字符串的地址。但是我看不到孩子发送的“字符串”的地址。如果我正确使用管道,请告诉我。

4

2 回答 2

1

指针和值之间有很多混淆。 write(readbuffer)发送 readbuffer 指向的内存,但是sizeof(readbuffer)是指针本身的大小。在父子句中,您试图读入 readbuffer 指向的缓冲区,由于 readbuffer 未初始化,它应该会崩溃。

正如@alk 所提到的,您可能想要write(fd[1], &readbuffer, sizeof(readbuffer))并且同样需要read(), 然后确保将 readbuffer 作为指针打印。如果您这样做,请将变量 readbuffer 重命名为更好地反映其用法的名称。

于 2013-06-26T17:16:15.520 回答
0

在父级中应该是:

printf("The address of the rcvd buffer : %p\n", (void *) readbuffer);

作为指针值(地址)应打印而不是它指向的“字符串”。


此外,代码不能确保sizeof(readbuffer)接收到字节,甚至不能确保调用read()没有失败。


更新:

正如彼得在他的回答中提到的那样,要读/写readbuffer它的值,必须将其地址传递给write()/ read()

write(fd[1], &readbuffer, sizeof(readbuffer));

...

nbytes = read(fd[0], &readbuffer, sizeof(readbuffer));
于 2013-06-26T16:41:54.320 回答