Das Ziel dieses Codes ist es, einen gemeinsamen Speicherbereich zu erstellen und den n-Wert in das untergeordnete Element zu schreiben und dann alle generierten Zahlen aus dem übergeordneten Prozess zu drucken. Aber dies druckt momentan nur Speicheradressen wie 16481443B4 aus, die sich jedes Mal ändern, wenn ich das Programm starte. Ich bin mir nicht sicher, ob ich falsch in den Shared Memory schreibe oder falsch aus dem Shared Memory lese. Möglicherweise beides.Problem beim Schreiben und Lesen von gemeinsam genutztem Speicherplatz 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;
}
An welchem Punkt überprüfen Sie für Fehler? – spectras
Ich habe keine Fehlerüberprüfung Code Ich kann davon ausgehen, dass die Eingabe immer korrekt ist –
Sagt wer? Jeder einzelne Anruf, den Sie verwenden, kann fehlschlagen. 'shm_open' kann' -1' zurückgeben. So kann 'ftruncate'. 'mmap' kann' MAP_FAILED' zurückgeben. 'fork' kann auch' -1' zurückgeben. Sie ** müssen ** nach Fehlerbedingungen suchen und danach handeln (z. B. den Fehlercode aus 'errno' ausdrucken, zB mit [' perror'] (https://linux.die.net/man/3/perror) und quit). – spectras