kann nicht kompilieren: client.msq.c:(.text+0x43): undefined reference to `smgget'



  • Hallo,

    ich benutze Geany C editor mit Ubuntu 7.10.

    Untenstehender Code läßt sich net Kompilieren wegen dieser Meldung:

    gcc -Wall "client.msq.c" -w -o client.msq (im Verzeichnis: /media/sdb1)
    /tmp/ccPLHBrl.o: In function `main':
    client.msq.c:(.text+0x43): undefined reference to `smgget'
    collect2: ld gab 1 als Ende-Status zurück
    Übersetzung fehlgeschlagen.
    

    Warum die Fehlermeldung?

    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <errno.h> 
    
    #define WARTE_AUF_PLATZ_IN_QUEUE     0
    #define MSG_KEY                      1
    #define MAX_LAENGE                   200
    
    int main(int argc , char **argv)
    {
    	int iMsgId;
    	int iTyp = 0;
    	int iFlag;
    
      struct message	
    	{
    		long mtype;
    		char mtext[MAX_LAENGE];			
    	}sMessage;
    
    	iMsgId = smgget(MSG_KEY,0);    /* Fehler wenn nicht vorhanden */
    
    	if(iMsgId < 0)
    	{
    		printf("Fehler %s bei msgget.\n",  strerror(errno));
    		exit(-1);	
    
    	}
    
    	while(iTyp != 50)
    	{
    			memset(sMessage.mtext, '\0', MAX_LAENGE);
    			sprintf(sMessage.mtext, "20");
    			printf("Auftrag eingeben: \n");
    			printf("10 - addieren\n");
    			printf("20 - subtrahieren \n");
    			printf("30 - dividieren \n");
    			printf("40 - multiplizieren  \n");
    			printf("50 - Ende \n");
    
    			scanf("%d", &iTyp);
    			sMessage.mtype = iTyp;
    			iFlag = WARTE_AUF_PLATZ_IN_QUEUE;
    
    			if(msgsnd(iMsgId, &sMessage, strlen(sMessage.mtext) + 1 , iFlag) < 0)
    			{
    				 printf("Fehler %s bei msgsnd \n" , strerror(errno));	
    
    			}
    			else
    			{
    				 printf("gesendeter Text: <%s> \n" , sMessage.mtext);
    
    			}
    
    	}
    
    	return 1;
    }
    


  • wo ist smgget



  • typo! sollte es nicht msgget heißen?



  • firefly schrieb:

    typo! sollte es nicht msgget heißen?

    sch... danke jungs!



  • 20:23:45: Konnte »"./server.msq"« nicht ausführen (Start-Script konnte nicht erzeugt werden)

    20:23:45: Konnte »"./server.msq"« nicht ausführen (Start-Script konnte nicht erzeugt werden)

    Beide dateien kann ich erstellen/kompilen aber nicht ausführen, da bekomme ich obige Meldung. Kann mir jemand bitte helfen?

    Hier nochmals kompletter Screenshot der Meldung:

    http://666kb.com/i/axz12vr32nlv9ofhv.png

    Hier nochmals ein Bild mit Einstellungen des gcc compiler:

    http://666kb.com/i/axz190hl91yo6lpbn.png

    Das ist noch der Code von der Server.msq.c datei:

    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <errno.h>
    #include <stdio.h>
    
    #define ERSTBESTE_NACHRICHT 0
    #define WARTE_AUF_NACHRICHT 0
    #define MSG_KEY             10001
    #define MAX_LAENGE          200
    
    main(void)
    {
      int iMsgId;
      int iPermFlag;
    
    	struct message
    	{
    		 long mtype;
    		 char mtext[MAX_LAENGE];
    	}sMessage;
    
    	int iRc , iInt , iIndex , iFlag , iZahl;
    	long lTyp;
    
    	iPermFlag = 0660 | IPC_CREAT; /* erzeuge MSQ, falls nicht vorhanden */
    
    	if((iMsgId = msgget(MSG_KEY, iPermFlag)) < 0 )
    	{
    		printf("Fehler bei msgget: %s \n" , strerror(errno));
    		exit(-1);
    
    	}
    
    	sMessage.mtype = -1;
    	while(sMessage.mtype != 50)
    		/* warte auf Nachricht des clients */
    
    		lTyp = ERSTBESTE_NACHRICHT;
    		iFlag = WARTE_AUF_NACHRICHT;
    		iRc = msgrcv(iMsgId, &sMessage, MAX_LAENGE, lTyp, iFlag);
    
    		if(iRc == -1)
    		{
    			printf("Fehler %s \n" , strerror(errno));
    		} 
    		else
    		{
    			 printf("Nachricht erhalten: %s \n" , sMessage.mtext);
    
    			 iZahl = atoi(sMessage.mtext);
    
    			 switch(sMessage.mtype)
    			 {
    					case 10: printf("Addition: %d \n" , iZahl + iZahl); break;
    					case 20: printf("Subtraktion: %d \n" , iZahl - iZahl); break;
    		      case 30: printf("Division: %d \n" , iZahl / iZahl); break;
    		      case 40: printf("Multiplikation: %d \n" , iZahl * iZahl); break;
    		      case 50: break;
    					default: printf("Falscher Message-Typ: \n" , iZahl + iZahl); break;
    
    	     }
    	  }  
      }
    
    }
    

    Wie man auf dem Bild sieht:

    http://666kb.com/i/axz1g2160i2q4pj77.png

    konnte ich das Server Programm ausführen und es ist als Prozess in der linux Prozess liste aufgeführt, doch warum läd sich das client.msq Programm nicht als Prozess in den Speicher ???



  • so mittlerweile gehts...

    nur warum bekomme ich diese Fehlermeldung "Permission denied bei MsgSnd" egal welche Zahl (10,20,30...) ich eingebe?

    http://img224.imageshack.us/my.php?image=messagequeuefehlerscreenj0.png



  • wo ist MsgSnd?



  • rofler schrieb:

    wo ist MsgSnd?

    ich der client.msq.c datei ganz unten!



  • seh ich nicht



  • rofler schrieb:

    seh ich nicht

    da?:

    if(msgsnd(iMsgId, &sMessage, strlen(sMessage.mtext) + 1 , iFlag) < 0)
                {
                     printf("Fehler %s bei msgsnd \n" , strerror(errno));   
    
                }
    

Anmelden zum Antworten