這不是一個很難懷疑的問題,但我不確定。
- 我的目標:我需要一個 C 程式,它可以通過 2 個軟體實體同時撰寫一個唯一的變數。
- 我的期望:使用父行程和子行程撰寫變數,并在每個行程使用處理器時列印該變數的值。
- 我的實際結果:我有一個程式,父母發送一個數字,孩子閱讀。
- 錯誤/警告:無(目前)。
- 我試過的:我的問題來了。我正在嘗試使用管道發送一個指標。當我從父行程讀取它時,它顯示了該指標的值,但是當我從子行程讀取它時,它讀取(部分)相同的指標值但“被截斷”。
我的問題:
- 這是同一個指標只是列印不同嗎?
- 如果不是,我如何修復父子之間相同的指標值?
代碼如下:
#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
提前致謝!
uj5u.com熱心網友回復:
問題是它buffer被宣告為指向的指標int,但它應該是指向指向的指標int。因此,子行程正在列印的值,*(buffer),不是作為指標傳遞的,而是int在您的系統上顯然是 4 個位元組,而一個指標是 8 個位元組。
要解決此問題,請更改行
int *buffer = (int*)calloc(1,sizeof(int));
進入
int **buffer = (int**)calloc(1,sizeof(int *));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364039.html
