このコードの目的は、共有メモリ空間を作成し、その子にnの値を書き込み、次に親プロセスから生成されたすべての数値を出力することです。しかし、これは現在、私がプログラムを実行するたびに変わる16481443B4のようなメモリアドレスを表示しているだけです。共有メモリへの書き込みが間違っているのか、共有メモリからの読み込みが正しくないのか分かりません。おそらく両方。共有メモリ空間への書き込みと読み出しの問題c
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <sys/mman.h>
int main(int argc, char** argv){
//shared memory file descriptor
int shm_fd;
//pointer to shared memory obj
void *ptr;
//name of shared obj space
const char* name = "COLLATZ";
//size of the space
const int SIZE = 4096;
//create a shared memory obj
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
//config size
ftruncate(shm_fd, SIZE);
//memory map the shared memory obj
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
int n = atoi(argv[1]);
pid_t id = fork();
if(id == 0) {
while(n>1) {
sprintf(ptr, "%d",n);
ptr += sizeof(n);
if (n % 2 == 0) {
n = n/2;
} else {
n = 3 * n + 1;
}
}
sprintf(ptr,"%d",n);
ptr += sizeof(n);
} else {
wait(NULL);
printf("%d\n",(int*)ptr);
}
//Umap the obj
munmap(ptr, SIZE);
//close shared memory space
close(shm_fd);
return 0;
}
あなたはエラーをチェックしますか? – spectras
エラーチェックコードはありません入力は常に正しいと思います –
誰が言っていますか?使用している通話はすべて失敗する可能性があります。 'shm_open'は' -1'を返します。だから 'ftruncate'するかもしれません。 'mmap'は' MAP_FAILED'を返します。 'fork'も' -1'を返すことができます。あなたは**エラー条件をチェックし、それらに対処する必要があります(例えば、 '' perror' '(https://linux.die.net/man/3/perror)でエラーコードを '終了します)。 – spectras