Ich verwende ein gemeinsames Speichersegment, um Daten und Änderungen gemeinsam zu nutzen, wenn ich andere Dateien ausführe.
Mein Code
#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
bool eaten = false;
void onInterruptSignal()
{
fprintf(stderr, "\nPellet PID is: %d - Died due to the interrupt!-Eaten: %s\n ", getpid(), eaten? " True ": "False");
exit(0);
}
void onTerminationSignal()
{
fprintf(stderr, "\nFish PID: %d - Died due to the termination!-Eaten: %s\n ", getpid(), eaten? " True ": "False");
exit(0);
}
int main(int argc, char *argv[])
{
signal(SIGINT, onInterruptSignal);
signal(SIGTERM, onTerminationSignal);
int sharedMemoryID; // Shared memory ID which will be assigned in it when the shared memory segment create successfully
key_t keyValue = 1337;
char(*sharedDataArray)[10][10];
// Create shared memory segment which return some value. But it returns -1 if it is not able create shared memory segment
if ((sharedMemoryID = shmget(keyValue, sizeof(char[10][10]), IPC_CREAT )) < 0)
{
perror("Error while creating memory segment.\n");
exit(1);
}
// Add the sharedDataArray in Shared memory so that it can be access by others
if ((sharedDataArray = (char(*)[10][10])shmat(sharedMemoryID, NULL,0)) == (char(*)[10][10]) - 1)
{
perror("Error while attching sharedDataArray to shared memory.\n");
exit(1);
}
srand(time(NULL));
int row = rand() % 10;
int col = rand() % 10;
while (*sharedDataArray[row][col]!= '#')
{
row = rand() % 10;
col = rand() % 10;
}
*sharedDataArray[row][col] = 0x50; // My terminal doesn't support extended ASCII, so we won't be using 0x50.
while (row < 9)
{
*sharedDataArray[row][col] = '#';
row++;
if (*sharedDataArray[row][col] == 'F')
{
*sharedDataArray[row][col] |= 0x50;
eaten =
true;
sleep(1);
break;
}
*sharedDataArray[row][col] = 0x50;
sleep(1);
}
if (!eaten)
{
*sharedDataArray[row][col] = '#';
}
else if (*sharedDataArray[row][col] == 0x50)
{
*sharedDataArray[row][col] = 'F';
}
sleep(1);
printf("Pellet PID is: %d, X: %d, Y: %d - eaten: %s\n", getpid(), row, col, eaten? "True": "False");
exit(0);
}
Ich erhalte eine Fehlermeldung, während ich den gemeinsamen Speicher anfüge, heißt es
Error while attching sharedDataArray to shared memory.
: Permission denied
Ich musste alle Befehle ausprobieren, um das gemeinsame Speichersegment zu löschen, ipcrm
und dann neu starten und meinen PC herunterfahren. Aber wenn ich es wieder öffne, bekomme ich den gleichen Fehler wie oben erwähnt.
Weiß bitte jemand, wie ich diesen Fehler wegbekomme?
BEARBEITET
shmget()
Erstellen Sie eine gemeinsam genutzte Speicher-ID. ipcs -m
Wenn Sie sie ausführen, wird der erstellte Shmid angezeigt, der jedoch keine Berechtigungen hat. Wie erteile ich ihnen die Erlaubnis?
IPCS-m
STRAHL
Lösung des Problems
Wenn Ihr Programm das Shared-Memory-Objekt erstellt, wird es mit Berechtigungen erstellt, die auf 0 gesetzt sind, dh überhaupt keine Berechtigungen. Siehe zB die Dokumentation von shmflg
in https://pubs.opengroup.org/onlinepubs/9699919799/functions/shmget.html
Vielleicht brauchen Sie so etwas wie
shmget(keyValue, sizeof(char[10][10]), IPC_CREAT | S_IRUSR | S_IWUSR);
Ihr Code wurde möglicherweise zuvor fehlerfrei ausgeführt, wenn bereits ein Shared Memory-Objekt mit ausreichenden Berechtigungen vorhanden war.
Keine Kommentare:
Kommentar veröffentlichen