Usuwanie kolejki komunikatów – błąd "invalid argument funkcji msgctl"

0

Witam. Napisałem program rozwiązujący problem klient-serwer. Działa niemal wszystko, wyjątkiem jest jedna funkcja (służąca do usuwania kolejki). Wewnątrz niej zawarłem funkcję msgctl, która obecnie zwraca błąd Invalid argument. Proszę o podpowiedź, gdzie może tkwić błąd.

Kod funkcji:

void deleteQ(int qid, Message* msg)
{
    int ctl=msgctl(qid, IPC_RMID, msg);
    if(ctl==-1)
    {
        perror("Blad funkcji deleteQ() - usuniecie kolejki nie powiodlo sie\n");
        exit(5);
    }

W ten sposób jej używam (kombinacja ctrl+c):

signal(SIGINT, &deleteQ);

Message jest strukturą:

typedef struct
{
    long addressee;     //adresat
    long sender;        //nadawca
    char text[M_SIZE];  //treść
} Message;

EDIT: Wpisałem NULL w miejsce struktury w wywołaniu funkcji smgctl. W deklaracji deleteQ zostawiłem tylko qid (id kolejki). W wywołaniu funkcji signal() wywaliłem ampersand. Niestety, błąd wciąż występuje.

0

Gdzie jest to wywołanie funkcji smgctl?

1

Rzuć okiem na man 2 signal:

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

Widzisz, że masz zły typ funkcji deleteQ, powinien być to typ sighandler_t (funkcja z jednym argumentem int zwracająca void)... Co więcej, int przekazywany do niej to po prostu numer sygnału, a ty chcesz, żeby to był identyfikator kolejki? Bez sensu... Jeśli to C, to chyba musisz użyć zmiennej globalnej na qid... :(

1

@koszalek-opalek: Dzięki. Jakimś cudem tego nie zauważyłem. Udało mi się rozwiązać problem bez zmiennej globalnej. W środku funkcji uruchamiam funkcje odpowiedzialne za tworzenie klucza i uzyskiwanie ID kolejki.

@szweszwe: Poprawione. Oczywiście chodziło o msgctl().

1

@nojaniewiem: I bardzo dobrze, bo zmienne globalne to zło. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1