Avatar billede kunop Nybegynder
30. oktober 2002 - 11:19 Der er 2 kommentarer og
1 løsning

Inkompatibel pointer

Jeg har et problem omkring pointeren i semop i funktionerne wait og signal, da jeg får warnings omkring pointerfejlen. Det er formentligt derfor, at programmet ikke tæller semaphoren ned! Kan i hjælpe mig med hvad der er galt?

#include <stdio.h>

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

#include <errno.h>

union semun
{
    int val;
    struct semdid_ds *buf;
    unsigned short int *array;
    struct seminfo *__buf;
}sem_union;

struct sembuf_struct
{
    short sem_num;
    short sem_op;
    short sem_flg;
};

int semid;

int wait()
{
    struct sembuf_struct sembuf;
    sembuf.sem_num = 0;
    sembuf.sem_op = -1;
    sembuf.sem_flg = SEM_UNDO;

    if(semop(semid, &sembuf, 1)==-1)
    {
        printf("wait fejl: %d\n", errno);
        perror("fail");
        return 0;
    }
    return 1;
}

int signal()
{
    struct sembuf_struct sembuf;
    sembuf.sem_num = 0;
    sembuf.sem_op = 1;
    sembuf.sem_flg = SEM_UNDO;
    if(semop(semid, &sembuf, 1)==-1)
    {
        printf("wait fejl: %d\n", errno);
        perror("fail");
        return 0;
    }
    return 1;
}

int main()
{
    semid = semget((key_t)2432, 1, 0666 | IPC_CREAT);
    printf("semaphore id %d\n", semid);

    sem_union.val = 1;

    if(semctl(semid, 0, SETVAL, sem_union)==-1)
        printf("Kunne ikke initialisere semaphore\n");

    wait();

    printf("HER MAA KUN VAERE EN PROCESS\n");
    sleep(30);

    signal();

    return 1;
}

Hilsen Kenneth
Avatar billede mbulow Nybegynder
30. oktober 2002 - 20:03 #1
Mon ikke det blot er en warning fordi semop-funktionen skal modtage en pointer til en sembuf, men modtager en pointer til en sembuf_struct.

Prøv at kalde din struktur for sembuf, og giv så variablen sembuf i signal og wait et andet navn, så der ikke opstår navnekonflikter :)
Avatar billede mbulow Nybegynder
30. oktober 2002 - 20:22 #2
Hvorfor definerer, og bruger, du egentlig sembuf_struct???

Den 'rigtige' sembuf struktur skulle da være defineret i sys/sem.h, som du allerede selv inkluderer... Den kan du vel bare bruge istedet for :)
Avatar billede soepro Nybegynder
07. november 2002 - 14:01 #3
Fordi en pointer til sembuf_struct IKKE er en pointer til en sembuf. Du kan -hvis du er 100 % sikker på at din sembuf_struct definition er korrekt- lave en cast for at undgår compiler-advarslen:

semop(semid, (sembuf *)&sembuf, 1)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester