这个指针值是否正确? (通过 C 中的管道发送指针)
Is correct this pointer value? (Sending a pointer through a pipe in C)
这不是很难怀疑,但我不确定。
- 我的目标:我需要一个由 2 个软件实例同时写入唯一变量的 C 程序。
- 我的期望:使用 parent 和 child 进程写入变量,并在每个进程使用处理器时打印该变量的值。
- 我的实际结果:我有一个程序,其中一个 parent 发送一个数字,一个 child 读取。
- Errors/warnings:None(现在)。
- 我试过的方法:这是我的问题。我正在尝试使用管道发送指针。当我从 parent 进程读取它时,它显示该指针的值,但是当我从 child 读取它时,它读取(部分)相同的指针值但“被截断”。
我的问题:
- 这是同一个指针只是打印不同吗?
- 如果不是,我如何修复 parent 和 child 之间的指针值相同?
代码如下:
#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
提前致谢!
问题是 buffer
被声明为指向 int
的指针,但它应该是指向 int
的指针。因此子进程正在打印的值 *(buffer)
不是作为指针传递的,而是作为 int
在您的系统上显然是 4 个字节而指针是 8 个字节。
要解决此问题,请更改行
int *buffer = (int*)calloc(1,sizeof(int));
进入
int **buffer = (int**)calloc(1,sizeof(int *));
这不是很难怀疑,但我不确定。
- 我的目标:我需要一个由 2 个软件实例同时写入唯一变量的 C 程序。
- 我的期望:使用 parent 和 child 进程写入变量,并在每个进程使用处理器时打印该变量的值。
- 我的实际结果:我有一个程序,其中一个 parent 发送一个数字,一个 child 读取。
- Errors/warnings:None(现在)。
- 我试过的方法:这是我的问题。我正在尝试使用管道发送指针。当我从 parent 进程读取它时,它显示该指针的值,但是当我从 child 读取它时,它读取(部分)相同的指针值但“被截断”。
我的问题:
- 这是同一个指针只是打印不同吗?
- 如果不是,我如何修复 parent 和 child 之间的指针值相同?
代码如下:
#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
提前致谢!
问题是 buffer
被声明为指向 int
的指针,但它应该是指向 int
的指针。因此子进程正在打印的值 *(buffer)
不是作为指针传递的,而是作为 int
在您的系统上显然是 4 个字节而指针是 8 个字节。
要解决此问题,请更改行
int *buffer = (int*)calloc(1,sizeof(int));
进入
int **buffer = (int**)calloc(1,sizeof(int *));