shm_open write read :operation not supported
-
hallo.
ich benutze mac os x 10.5.
mit gcc kompiliere ich mein programm://#include "3b.h" #include <stdio.h> #include<stdlib.h> #include<dirent.h> #include<String.h> #include<time.h> #include<sys/stat.h> #include <unistd.h> #include <fcntl.h> #include<sys/types.h> #include <ctype.h> #include <math.h> #include <sys/mman.h> int ctoi(char c){ char h[1]; h[0]=c; return atoi(h); } void itoa(int number,char* number_str){ sprintf(number_str, "%i", number); //return number_str; } void status(int* fd,char* s){ write(*fd,s,sizeof(s)); } struct Auftrag{ int empty; char s[30]; int cpid; int nummer; }; struct chain{ struct chain* next; struct chain* last; struct Auftrag a; }; struct SStatus{ char doing[30]; int pida; int nummera; int pid; int nummer; }; struct Client{ int pid; int alife; }; void getdown(int i){ printf("SIGTERM erhalten. beende mich...\n"); int ii=(shm_open("status.tmp",O_TRUNC,S_IRWXU)); status(&ii,"b"); sleep(10); printf("runtergefahren"); exit(0); } void stochars(void* s,char* c,int size){ int i=0; printf("size:%i\n",size); for(i=0;i<size;i++){ *(c+i)= * (((char *) s)+i); printf("Q%iQ",i); } } void charstos(char * c,void * s,int size){ int i=0; for(i=0;i<size;i++){ printf("A%iA",i); *((char *)(s+i)) = *((char *)(void *)((c)+i)); } } int ffwrite(void * v,int size,int count,int fd){ char c[size]; if(0>=memcpy(c,v,size-1)){ perror("FEHLER ffwrite memcpy"); } int r=write(fd,c,size); if(r<=0){ perror("ERROR ffwrite write"); printf("dats: fd %i c %s size%i",fd,c,size); } return r; } int ffread(void * v,int size,int count,int fd) { char c[size]; int r=read(fd,c,sizeof(c)); memcpy(v,c,size-1); return r; } int main(int argc,char *argv[]){ printf("bla\n"); extern int errno; struct Auftrag auftrag,altauftrag; int i=0; int t=0; int clientcounter=0; printf("max anzahl clients: int %i\n",sizeof(auftrag)); char max[10]; //scanf("%s",max); int clientids[atoi(max)]; char input[200]; int toserver; int toclient; int interface; printf("%i unlink\n",shm_unlink("/toclient.tmp")); shm_unlink("/interface.tmp"); int ts=mkfifo("toserver.tmp", S_IRWXU);perror("fehler1 "); errno=0; toserver=open("toserver.tmp",O_RDWR|O_TRUNC,S_IRWXU);perror("fehler2 "); errno=1; //pa=mmap(addr, len, prot, flags, fildes, off); toclient= shm_open("/toclient.tmp",O_CREAT|O_RDWR,S_IRWXU);perror("fehler3 "); errno=0; //void* cptr=mmap(0,sizeof(int), PROT_WRITE,MAP_SHARED,toclient,0);perror("fehler4 "); errno=33; interface=shm_open("/interface.tmp",O_CREAT|O_RDWR ,S_IRWXU);perror("fehler5 "); errno=0; //memcpy(cptr,&i,sizeof(int)); printf("server%i client%i interface%i (%i)\n",toserver,toclient,interface,errno); perror("fehler "); i=getpid(); auftrag.empty=1; auftrag.nummer=1; strcpy(auftrag.s,"hallo klaptz?"); printf("noch\n"); //memcpy(max,&auftrag,sizeof(auftrag)-1); //exit(0);errno=0; write(toserver,&auftrag,sizeof(auftrag)); perror("1write "); ffwrite(&auftrag,sizeof(auftrag),1,toserver); perror("Uwrite "); //ffwrite(&auftrag,sizeof(auftrag),1,toserver); signal(SIGTERM,getdown); i=getpid(); printf("%i bytes geschrieben\n", write(toserver,&(i),sizeof(int)-1)); perror("2write "); printf("%i bytes geschrieben\n", write(interface,&(i),sizeof(int)-1)); perror("2write "); printf("%i bytes geschrieben\n", write(toclient,&(i),sizeof(int)-1)); perror("2write "); lseek(interface,0,SEEK_SET);perror("seek "); printf("initialisiert!\n"); while(1){ printf("in while loop\n"); t= read(toserver,&auftrag,sizeof(auftrag)); printf("SSSSSS%i\n",t); if(t>0){ //wenn auftrag ausgelesen werden konnte if(!auftrag.empty){ memcpy(&altauftrag,&auftrag,sizeof(auftrag)); printf("auftrag NR. %i von client %i:\n%s\n",auftrag.nummer,auftrag.cpid,auftrag.s); } else if(auftrag.nummer>0){//platzhalter damit file nicht leer write(toserver,&auftrag,sizeof(auftrag)); printf("platzhalter\n"); } else if(auftrag.nummer==-1){//dann wurde client beendet. pid aus liste schmeißen printf("client löschen\n"); int id=auftrag.cpid; printf("CC\n"); int found=0; for(i=0;i<sizeof(clientids)/sizeof(int);i++){ if(clientids[i]==-2||&clientids[i]==0){ break; printf("BREAK\n"); } if(clientids[i]==id){ found=1; printf("FOUND\n"); } if(found){ if(i+1<sizeof(clientids)/sizeof(int)){ clientids[i]=clientids[i+1]; printf("rücke auf i=%i\n",i); } else{ clientids[i]=-2; printf("auf -2 setzen i=%i\n"); } } } clientcounter--; } } printf(":-\n"); int ifpid=0; lseek(interface,0,SEEK_SET); printf("%i bytes gelesen if\n",ffread(&ifpid,sizeof(int),1,interface)); //printf("\n-_-%s\n",chid); if(ifpid==getpid()){//wenn server pid in interface steht hat er das interface lseek(interface,0,SEEK_SET); write(interface,&ifpid,sizeof(int)); printf("eingabe:"); int iid=0; scanf("%s %d",input,&iid); printf("WWWWW\n"); printf("string:(%s) int:(%i)\n",input,iid); printf("nc %d ,sc %d, tc %d\n",strstr(input,"newc"),strstr(input,"showc"),strstr(input,("toc"))); if(strstr(input,"newc")!=0){//neuer client printf("befehl: newc"); int cid=fork(); if(cid==0){ execv("client",argv); exit(0); } if(cid<0){ printf("client konnte nicht erzeugt werden!:%i",cid); } else{ clientids[clientcounter]=cid; clientcounter++; } } if(strstr(input,"showc")!=0){//alle clients anzeigen printf("%i clients\n",clientcounter); for(i=0;i<=clientcounter;i++){ printf("%i clientid:%i\n",i,clientids[i]); } } if(strstr(input,("toc"))!=0){//zu client interface wechseln for(i=0;i<sizeof(clientids)/sizeof(int);i++){ if(clientids[i]==iid){ int iinterface =shm_open("interface.tmp",O_TRUNC,S_IRWXU); char ch[5]; itoa(iid,ch ); write(iinterface,ch,5); break; } } } } printf("nextround:\n"); sleep(1); } return 1; }
Ausgabe ist:
bla max anzahl clients: int 44 0 unlink fehler1 : File exists fehler2 : File exists fehler3 : File exists fehler5 : File exists server3 client4 interface5 (0) fehler : File exists noch 1write : File exists Uwrite : File exists 3 bytes geschrieben 2write : File exists -1 bytes geschrieben 2write : Operation not supported -1 bytes geschrieben 2write : Operation not supported seek : Illegal seek initialisiert! in while loop SSSSSS44 platzhalter :- -1 bytes gelesen if nextround:
warum kann ich nichts auf meinen shared memory schreiben und nichts lesen?
mit mmap kann ich auch nicht zugreifen.
immer operation not supported!
:?
danke schonmal
-
Hast Du Dir das SharedMemorySegment geholt?
Prototyp:
int shmget ( key_t key, int size, int shmflg )
Also z.B.:
int shmid = shmget( 1234,1000, IPC_CREAT | 0660 );
-
in den beispielen von der vorlesung gab es kein shmget.
es sollte einfach mit shm_open funktionieren.
-
könntest du bitte versuchen, dein programm so zu kürzen, dass der fehler gerade noch auftaucht? dein programm ist etwas zu lang für hier. kaum einer wird interesse haben, sich das alles durchzuschauen.
die linux manpage meint, dass man ftruncate auf dem file descriptor, den shm_open zurückgibt, ausführen muss, wenn der shared memory bereich neu erzeugt wurde. möglicherweise gibt mmap operation not supported zurück, wenn man das noch nicht getan hat. ich hab die funktion jedenfalls in deinem code nicht gefunden.
-
hier ein anderes Beispiel:
ich hoffe es ist verständlicher.//#include "3b.h" #include <stdio.h> #include<stdlib.h> #include<dirent.h> #include<String.h> #include<time.h> #include<sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <ctype.h> #include <math.h> int main(void) { char str[32]; //String der zunächst in die shared memory datei geschrieben wird. anschließend wird in der do schleife das leseergebnis in str geschrieben int size; //in size steht in der do schleife die anzahl der gelesenen bytes bzw. -1 bei einem fehler int fdShm; //filedescribtor der auf den shared memorybereich verweisen soll bzw. -1 enthält bei einem fehler if((fdShm = shm_open("/shm.tmp", O_RDWR|O_CREAT|O_TRUNC,0777))==-1){ perror("konnte shared memory nicht öffnen!!!"); if((fdShm = shm_open("/shm.tmp", O_RDWR|O_CREAT ,0777))==-1){ perror("konnte shared memory nicht öffnen!!!"); } else printf("shared memory geöffnet!(2)\n"); } else printf("shared memory geöffnet!(1)\n"); strcpy(str,"hallo welt quit"); if(write(fdShm, &str, sizeof(str))==-1){//hier sollte etwas in die shared memory datei gerschrieben werden. perror("konnte nicht auf shared memory schreiben!!!"); } else printf("schreiben erfolgreich\n"); int i=0; do //hier wird solange aus der shared memory datei gelesen bis quit in str enthalten ist oder i>=10 { i++; if(lseek(fdShm, 0, SEEK_SET)==-1){ perror("konnte Lesezeiger nicht verschieben!!!"); } else printf("lesezeiger verschoben\n"); if((size = read(fdShm, &str, sizeof(str)))==-1){ perror("konnte nicht aus schared memory datei lesen!!!"); }else printf("lesen erfolgreich\n"); printf("%i ",size); str[size] = 0; printf("%s\n", str); } while(strncmp(str, "quit", strlen("quit")) !=0 && i<10); //shared memory wird geschlossen und unlink vorgenommen if(close(fdShm)==-1){ perror("konnte shared memory datei nicht schließen!"); }else printf("shared memory datei erfolgreich geschlossen \n"); if(shm_unlink("/shm.tmp")==-1){ perror("konnte shared memory nicht unlinken!"); }else printf("shared memory unlink erfolgreich \n"); exit(0); }
die Ausgabe ist:
konnte shared memory nicht öffnen!!!: Invalid argument shared memory geöffnet!(2) konnte nicht auf shared memory schreiben!!!: Operation not supported konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte Lesezeiger nicht verschieben!!!: Illegal seek konnte nicht aus schared memory datei lesen!!!: Operation not supported -1 hallo welt quit konnte shared memory datei nicht schließen!: Invalid argument shared memory unlink erfolgreich
ich benutze mac osx 10.5.6 gcc
warum kann ich nicht auf mein shared memory lesen /schreiben/lesezeiger verschieben?
Vielen Dank für eure Mühe.
-
ich hab deinen code mit linux ausprobiert. dort funktioniert er fehlerfrei. leider kenn ich mich bei mac os x nicht aus.