IIC2333 / foro-2019-1

Foro oficial del curso IIC2333 - Sistemas Operativos y Redes, semestre 2019-1.
2 stars 0 forks source link

memcpy error (invalid write of size 1) #61

Closed Sgwa closed 5 years ago

Sgwa commented 5 years ago

Hola, tengo un problema al usar memcpy para copiar una struct a la shared memory.

En un principio mi struct era asi:

struct Memsem
{
    sem_t sem_map;
    sem_t sem_reduce;
    int reduce_signal;
    char word[256];
};

Donde solo guardaba 1 string de largo 256 y de esa forma funcionaba todo bien, podia copiarlo a la shared memory usando memcpy sin ningun problema y usarlo en los forks al castear el struct desde la shared memory, pero luego le hice modificaciones:

struct Memsem
{
    sem_t sem_map;
    sem_t sem_reduce;
    int reduce_signal;
    char word[100][256];
};

Para que alojara un array de 100 strings de largo 256. Aumente la memoria dada a shmget para que el struct cupiera tanto en el main como en los forks, pero me encuentro con este error

image

Aqui el codigo donde defino la shared memory y trato de copiar el struct.

for (int i = 0; i < R_r; i++)
    {
        printf("times: %d\n", i);
        keys[i] = ftok("./memoria", i);
        shmids[i] = shmget(keys[i], 32768, IPC_CREAT | SHM_W | SHM_R);
        printf("shmids: %lu\n", shmids[i]);
        void *shared_memory = shmat(shmids[i], NULL, 0);
        printf("size struct: %lu\n", sizeof(struct Memsem));
        memcpy(shared_memory, memsem[i], sizeof(struct Memsem)); //<-----ERROR-------
        shared_memories[i] = (struct Memsem *)shared_memory;
        sem_init(&((shared_memories[i])->sem_map), 1, 0);
        sem_init(&((shared_memories[i])->sem_reduce), 1, 0);
        sem_post(&((shared_memories[i])->sem_map));
        printf("end times\n");
    }

(Por si es necesario aclarar: el error ocurre en la primera iteracion del for)

Aqui esta lo que imprimen los prints al momento de caerse, se puede observar que la memoria del struct es menor a la puesta en el shmget y que la ejecucion del shmget no falla al dar un numero positivo.

image

Por lo que no he sido capaz de encontrar el error.

Geeermy commented 5 years ago

¡Hola! ¿Podrías usar errno para ver si obtienes más detalles del error? Imprímelo antes y después de cada función para ver cómo cambia el valor de errno. Viendo los valores impresos (dirección 0xfff...) es posible que estés con errno 22, i.e. que el argumento de una de tus funciones es inválido.

Cuéntanos cómo te va.

Referencias: 1) http://man7.org/linux/man-pages/man3/errno.3.html 2) https://www.tutorialspoint.com/cprogramming/c_error_handling.htm 3) https://stackoverflow.com/questions/503878/how-to-know-what-the-errno-means

¡Suerte!

PD: Solo para verificar... en la carpeta de ejecución existe el archivo "memoria", ¿cierto?

nfbalbontin commented 5 years ago

¿Se puede usar la librería semaphore.h ?

IchottMano commented 5 years ago

@nfbalbontin Como dije en la issue #43, pueden usar las librerías de POSIX de C.

Saludos!