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 に答える