【问题标题】:Is correct this pointer value? (Sending a pointer through a pipe in C)这个指针值正确吗? (通过 C 中的管道发送指针)
【发布时间】:2022-01-01 11:14:38
【问题描述】:

这不是一个很难的疑问,但我不确定。

  1. 我的目标:我需要一个 C 程序,它可以通过 2 个软件实例同时写入唯一变量。
  2. 我的期望:使用父进程和子进程编写变量,并在每个进程都有自己的处理器使用时间时打印该变量的值。
  3. 我的实际结果:我有一个程序,父母发送数字,孩子阅读。
  4. 错误/警告:无(目前)。
  5. 我的尝试:我的问题来了。我正在尝试使用管道发送指针。当我从父进程读取它时,它会显示该指针的值,但是当我从子进程读取它时,它会(部分)读取指针的相同值但“被截断”。

我的问题:

  • 这是同一个指针,只是打印的不同吗?
  • 如果不是,如何修复指针值在父子节点之间相同?

代码如下:

#include <sys/types.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#define DIM 100000

int main(void){
    printf("\n Buffer del sistema = %d\n ",BUFSIZ);
    int bytes_sent = 0, bytes_read = 0, i = 0, *FD=NULL;
    FD = (int*)calloc(2,sizeof(int));
    int *buffer = (int*)calloc(1,sizeof(int));
    int pid = 0;
    if(!pipe(FD)){
        pid = fork();
        if (pid < 0){
            perror("Error al crear bifurcación");
            exit(pid);
        }
        if (pid == 0){
            for(i=0;i<=27;i++){
                bytes_read = read(*FD,buffer,8);
                printf("\nEl proceso hijo ha leído %d bytes.\nEl contenido es: %p\n", bytes_read,*(buffer));
            }
        exit(0);
        }
        else{
            int a = 10, *z = &a;
            int **pp = &z;
            printf("\nApuntador: %p\n", z);
            for(i=DIM;i<DIM+30;i++){
                bytes_sent = write(*(FD+1),pp,sizeof(int*));
                printf("\nEl proceso padre ha enviado %d bytes\n",bytes_sent);
                usleep(DIM);
            }
        }
    }
    return 0;
}

执行时的输出是这样的:


 Buffer del sistema = 8192
 
Apuntador: 0x7ffedc1370ec

El proceso padre ha enviado 8 bytes
 
El proceso hijo ha leído 8 bytes.
El contenido es: 0xdc1370ec

... some repeated output here ...

El proceso hijo ha leído 8 bytes.
El contenido es: 0xdc1370ec

El proceso padre ha enviado 8 bytes

El proceso padre ha enviado 8 bytes


------------------
(program exited with code: 0)
Press return to continue

提前致谢!

【问题讨论】:

  • 两个进程无法读取对方的内存,除非它们正在写入和读取共享内存段。
  • 您只读取了 8 个字节。 0x7ffedc1370ec 是 12 个字节,而您只读取其中的 8 个。
  • @JeffHolt 谢谢,我是这么想的,但我想先确认一下。让我检查共享内存以改进我的程序。再次感谢!
  • @aviro 我已经按照你的想法,我已经将缓冲区从 8 更改为 12 甚至 16,但仍然发生相同的情况:(
  • 是的,这不是问题。指针是 8 个字节,而您只看到 4 个字节。请参阅下面的答案。

标签: c pointers pipe fork


【解决方案1】:

问题是buffer被声明为指向int的指针,但它应该是指向int的指针。因此,子进程正在打印的值*(buffer) 不是作为指针传递,而是int 在您的系统上显然是 4 个字节,而指针是 8 个字节。

要解决此问题,请更改行

    int *buffer = (int*)calloc(1,sizeof(int));

进入

    int **buffer = (int**)calloc(1,sizeof(int *));

【讨论】:

  • 哇!它解决了一切。我将继续我的测试,但现在它在我需要的时候帮助了我。真的很感谢你!编辑:我没有注意这一点,因为我认为所有指针的大小都相同,现在我知道了。
  • @xebuzer0 通常不鼓励使用malloc 的转换结果。分配的首选模式是buffer = calloc(n, sizeof *buffer);。无论buffer 是什么类型,它都会一直工作
  • @tstanisl 好点。我做了最小的改变,但int **buffer = calloc(1,sizeof(* buffer)); 是更好的做法。
猜你喜欢
  • 2018-08-13
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多