undefined reference to open

0
 #include <stdio.h>
  #include <stdlib.h>
  #include <linux/ipc.h>
  #include <linux/msg.h>
  
  main()
  {
          int    qid;
          key_t  msgkey;
          struct mymsgbuf {
                  long    mtype;          /* typ wiadomości */
                  int     request;        /* numer żądania danego działania */
                  double  salary;         /* zapłata od pracodawcy */
          } msg;
  
          /* tworzymy wartość klucza IPC */
          msgkey = ftok(".", 'm');
  
          /* otwieramy/tworzymy kolejkę */
          if(( qid = open_queue( msgkey)) == -1) {
                  perror("otwieranie_kolejki");
                  exit(1);
          }
  
          /* nasze przykładowe dane */
          msg.mtype   = 1;        /* typ wiadomości musi być dodatni */   
          msg.request = 1;        /* element #1 */
          msg.salary  = 1000.00;  /* element #2 ( mój roczny zarobek! ) */
          
          /* Bomby poszły! */
          if((send_message( qid, &msg )) == -1) {
                  perror("wysyłanie_wiadomości");
                  exit(1);
          }
  }

tak wyglada kod programu... jednak poczas kompilacji gcc wyswietla mi sie komunikat undefined reference to open...
Czemu tak sie dzieje ? ;(

0

Zalinkuj sobie:

sys/types.h     -- dla open
sys/stat.h       -- dla open
fcntl.h            -- dla open
unistd.h         -- dla close

W sys/types.h jest open. W fcntl.h masz rozne flagi do tego, a sys/stat struktura stat, jakies funkcje typu fstat i lstat. Napisane w manualu zreszta masz, ze te 3 pierwsze sa do open...

0

Zasugerowalem sie nazwa tematu i tym co napisales, a na kod nie patrzylem ;p
Jak masz ten undefined reference dla open_queue to dotyczaj ten tekst, z ktorego kod skopiowales, bo open_queue to 'wrapper' dla msgget ;)

int open_queue(key_t keyval)
{
   int qid;

   if((qid = msgget(keyval, IPC_CREATE | 0660)) == -1) 
   {
        return -1; 
   }

   return qid;
}
0

No dobra chcialem sprawdzic dzialanie kodu ale nie dziala, nie napisalem ze to moj kod...
a tam nie ma nic napisane
...
http://www.linuxpl.org/LPG/node34.html

0
kubatur0 napisał(a)

No dobra chcialem sprawdzic dzialanie kodu ale nie dziala, nie napisalem ze to moj kod...
a tam nie ma nic napisane
...
http://www.linuxpl.org/LPG/node34.html

Ja wzialem info o tym z tad http://www.google.pl/url?sa=t&source=web&cd=1&ved=0CBQQFjAA&url=http%3A%2F%2Fusers.evtek.fi%2F~tk%2Frtp%2Fsyscall.pdf&rct=j&q=open_queue+syscall+pdf&ei=kz8NTJiFF4OWOO6ojBs&usg=AFQjCNHbyFGf_kJ8a1UK72Rn4XcUqIHvLw, wydaje sie, ze jest wszystko wyjasnione.

0

Tak z ciekawości: może mi ktoś wyjaśnić, czemu open_queue nie jest zapisana po prostu tak jak poniżej?

int open_queue(key_t keyval)
{
   return msgget(keyval, IPC_CREATE | 0660);
} 

Ta oryginalna wersja jest zgodna z jakąś ichniejszą konwencją, czy może coś przeoczyłem?

0
bswierczynski napisał(a)

Ta oryginalna wersja jest zgodna z jakąś ichniejszą konwencją, czy może coś przeoczyłem?

Tego nikt nie wie, ja sie dopiero o open_queue dowiedzialem z tego watku, wiec zaczalem szukac co to za wymysl i taka implementacje jak wyzej znalazlem w LPG, ale pewnie ze mozna napisac krocej :)

0

hm.. nie wiem, może to taki specyficzny rodzaj grafomanii? //edit35 <------ w TEJ linii już nie ma Twojego nick'a, wiec sie uspokój i sprobuj zrozumiec sens
edit: albo, czekaj, mając w pamięci dyskalkulię, może to: dyssimplipathlogia, czyli niemożność upraszczania ścieżek logicznych

edit2: ah, to nie Twoje dzieło? to przepraszam! przekierowuje sformulowanie do oryginalnego nieznanego autora kodu:)

0

Uspokajac sie nie musze, panuje nad soba :)

Kilka interpretacji moich Twojego pierwszego zdania w takiej formie jak teraz zostawiles ma rozny sens, ale kazde ma sens. Chociaz przez to do konca nie wiem teraz co masz na mysli.

Moze skierowales to zdanie do mnie i sie do mnie odnosisz.
Moze skierowales to zdanie do mnie, ale juz sie odnosisz do autora kodu.
Moze nie skierowales tego zdania do mnie, tylko do autora kodu lub do ktorejkolwiek osoby w tym watku.

Co do pierwszego to sens moze byc taki, ze napisalem do bswierczynskiego, ze mozna napisac to krocej tak jak on przedstawil, a Tobie chodzi o to, ze w ogole nie trzeba opakowywac funkcji msgget.
Druga interpretacja do pierwszego przypuszczenia polega na tym, ze wrzucilem ten kod zamiast napisac, zeby po prostu uzyl msgget.
Jesli chodzi o drugie przypuszczenie to mozesz sie nabijac z autora tego kodu po prostu. - pewnie to
Co do trzeciego to nie chce mi sie juz pisac jak to interpretuje, bo to malo prawdopodobne, abys to mial na mysli, poniewaz skierowales to zdanie do mnie.

Natomiast, biorac pod uwage calosc Twojej wypowiedzi zostaje mi drugie przypuszczenie, to pogrubione.

edit:
quetzalcoatl: z uwagi na piecio minutowa roznice miedzy Twoim, a moim postem nie wzialem pod uwage tego ze mogles pisac odpowiedz w miedzyczasie :)

0

Ale FAIL. Dziekuje za zabawna i logiczna odpowiedz przypominajaca, ze i ja czasem pisze/myśle chaotycznie :))) Jednak odcyfrowales to w 100%

Odpisywalem bswierczynskiemu, lecz mnie ubiegles w trakcie, dlatego moj post jest ponizej, acz z mojego pukntu widzenia byl przed Twoim, stad chaos.

Poczatkowo, tzn. dopoki nie przeczytalem Twojego postu ktorym mnie ubeigles, sadzilem ze ten wrap na msgget ktory podales jest Twoim dzielem, stad przed editem, w moim poscie bylo odniesienie do Ciebie, jako celu ponizszych okreslen:

pod grafomanią, mialem na mysli potrzebe pisaania dużo, niekoniecznie z sensem
pod dyssimplipathlogia - wymyslona na predce nazwa przypadlosci. Wlasciwie to sobie gdzies to zapisze..

zas jako "do autora kodu" - caly czas chodzilo mi o kod wrappera msgget ktory podales, stada "autor kodu" == autor tego wycinka z ksiazki

a edit35 powinien byl brzmiec: spoko, nie zaczynaj flame'a, nie chodzi o Ciebie, śmieje się z kodu z kodu wrappera

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