» »

[C] Sinhronizacija procesov

[C] Sinhronizacija procesov

Cvenemir ::

Lep pozdrav.

Težave imam pri sinhronizaciji, in sicer mi shm1b preko spinlocka sporoči, da lahko shm1a nadaljuje in šele nato skopira podatke v pomnilnik, kar bi pomoje moralo delovati ravno obratno. Kar nekaj časa že poskušam rešiti težavo, a se mi ne posveti.

shm1a
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <unistd.h>


int main() 
{
    /* Deklaracija spremenljivk */
    int skupniPomnilnik;
    int skupniPomnilnik2;
    int* pomnilnik;
    char* pomnilnik2;

    /* Ustvarimo prvi skupni pomnilnik */
    skupniPomnilnik = shmget(1059816, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600);
    if(skupniPomnilnik < 0) 
    {
        perror("Napaka. Pomnilnik ni ustvarjen.");
        return(errno);
    }

    /* Ustvarimo drugi skupni pomnilnik */
    skupniPomnilnik2 = shmget(1059817, 21*sizeof(char), IPC_CREAT | IPC_EXCL | 0600);
    if(skupniPomnilnik2 < 0) 
    {
        perror("Napaka. Pomnilnik 2 ni ustvarjen.");
        return(errno);
    }

    /* Ustvarimo prvi kazalec na skupni pomnilnik */
    pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
    if(pomnilnik == (int*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }

    /* Ustvarimo drugi kazalec na skupni pomnilnik 2 */
    pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
    if(pomnilnik2 == (char*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }	
    
    *pomnilnik = 0;

    /* Spinlock*/
    while(*pomnilnik == 0)
    {
    }

    /* Izpis */
    printf("%s\n", pomnilnik2);

    /* Odklopimo pomnilnika */
    shmdt(pomnilnik);
    shmdt(pomnilnik2);

    /* Brisanje pomnilnikov */
    int brisi1;
    int brisi2;

    brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
    brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);

    if(brisi1 == 0) 
    {
        printf("Izbrisano!");
    } 

    if(brisi2 == 0) 
    {
        printf("Izbrisano!");
    } 

    return 0;
}/* Konec programa shm1a */


shm1b
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <unistd.h>

int main() 
{
    /* Definicija spremenljivk ipd.... */
    char znaki[] = "!!!!!!!!!!!!!!!!!!!!\0";
    int skupniPomnilnik;
    int skupniPomnilnik2;
    int* pomnilnik;
    char* pomnilnik2;

    /* Ustvarimo prvi pomnilnik */
    skupniPomnilnik = shmget(1059816, 0, 0);
    if(skupniPomnilnik < 0) 
    {
        perror("Napaka!");
        return(errno);
    }

    /* ustvarimo drugi pomnilnik */
    skupniPomnilnik2 = shmget(1059817, 0, 0);
    if(skupniPomnilnik2 < 0)
    {
        perror("Napaka!");
        return(errno);
    }

    /* Prvi kazalec */
    pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
    if(pomnilnik == (int*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }

    /* Drugi kazalec */
    pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
    if(pomnilnik2 == (void*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }	

    *pomnilnik = getpid();
    /* Skopiramo znake v pomnilnik 2 */
    strcpy(pomnilnik2, znaki);	

    /* Odklopimo pomnilnika */
    shmdt(pomnilnik);
    shmdt(pomnilnik2);	

    /* Brisanje pomnilnikov */
    int brisi1;
    int brisi2;

    brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
    brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);

    if(brisi1 == 0) 
    {
        printf("Izbrisano!\n");
    } 

    if(brisi2 == 0) 
    {
        printf("Izbrisano!\n");
    } 
    return 0;
}/* Konec programa smh1b */
  • poskusil klonirati: Cvenemir ()

bi0s ::

Prvo vpiši znake v pomnilnik2, nato vpiši PID v pomnilnik1. Sedaj se ti vpiše PID v shm1b, se neha spinlock, in nima kaj za izpisat.

Cvenemir ::

Sem popravil, a še vedno nič ne izpisuje. Si slučajno zasledil še kakšno drugo napako?

c0dehunter ::

Si poskusil v shm1a namesto namesto pomnilnik2 izpisati kar nek string, da vidiš če sploh dela? Lahko da je pomnilnik2 prazen.
I do not agree with what you have to say,
but I'll defend to the death your right to say it.

Cvenemir ::

sem probu, pa ne izpiše nič

amacar ::

Nekak tak je šlo meni skos na vajah:

shm1a.c

#include <stdio.h>
#include <stdlib.h> 
#include <sys/shm.h>
#include <errno.h>

int main()
{
  int shmid;
  int* kazalec;
  shmid=shmget(1043444,sizeof(int),IPC_CREAT | IPC_EXCL |0600);
  if (shmid<0)
  {
    perror("Napaka");
    return(errno);
  }
  kazalec=(int *)shmat(shmid,(void *)0, 0);
  if (kazalec==(int *)-1)
  {                        
    perror("Nisem dobil kazalca");
    return -1;
  }

  *kazalec=0; /*v pomnilnik vpišemo 0*/
  while(*kazalec==0)
  {
	/*ne delaj nič*/
  }
  int i=shmdt(kazalec);
  if (i<0)
  {
    perror("Napaka");
    return -1;
  }
  i=shmctl(shmid,IPC_RMID,0);
  if (i==0)
  {
    printf("Skupni pomnilnik je zbrisan!\n");
  }
  else
  {
    return(errno);
  }
  return 0;
}


shm1b.c

#include <stdio.h>
#include <stdlib.h> 
#include <sys/shm.h>
#include <errno.h>

int main()
{
  int shmid;
  int* kazalec;
 
  shmid=shmget(1043444,0, 0);
  if (shmid<0)
  {
    perror("Pozeni najprej shm1a");
    return(errno);
  }

  kazalec=(int *)shmat(shmid,(void *)0, 0);
  if (kazalec==(int *)-1)
  {
    perror("Nisem dobil kazalca");
    return -1;
  }
  *kazalec=getpid();
  int i=shmdt(kazalec);
  if (i<0)
  {
    perror("Napaka");
    return -1;
  }
  i=shmctl(shmid,IPC_RMID,0);
  if (i==0)
  {
    printf("Skupni pomnilnik je zbrisan!\n");
  }
  else
  {
    return(errno);
  }
  return 0;
}

Cvenemir ::

Mislim, da to ni ista naloga.

Cvenemir ::

Lp. Zanima me, zakaj se mi spinlock v shm1a ne zaključi, ko v shm1b v pomnilnik zapišem 1(vrstica 58).

shm1a:
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <unistd.h>


int main() 
{
    /* Deklaracija spremenljivk */
    int skupniPomnilnik;
    int skupniPomnilnik2;
    int* pomnilnik;
    char* pomnilnik2;
	int i;

    /* Ustvarimo prvi skupni pomnilnik */
    skupniPomnilnik = shmget(1059816, 1*sizeof(int), IPC_CREAT | IPC_EXCL | 0600);
    if(skupniPomnilnik < 0) 
    {
        perror("Napaka. Pomnilnik ni ustvarjen.");
        return(errno);
    }

    /* Ustvarimo drugi skupni pomnilnik */
    skupniPomnilnik2 = shmget(1059817, 20*sizeof(char), IPC_CREAT | IPC_EXCL | 0600);
    if(skupniPomnilnik2 < 0) 
    {
        perror("Napaka. Pomnilnik 2 ni ustvarjen.");
        return(errno);
    }

    /* Ustvarimo prvi kazalec na skupni pomnilnik */
    pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
    if(pomnilnik == (int*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }

    /* Ustvarimo drugi kazalec na skupni pomnilnik 2 */
    pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
    if(pomnilnik2 == (char*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }	
    
    *pomnilnik = 0;

    /* Spinlock*/
    while(*pomnilnik == 0)
    {
    }

    /* Izpis */
    for(i=0; i<20; i++)
    {
        printf("%c\n",pomnilnik2[i]);
    }    

    /* Odklopimo pomnilnika */
    shmdt(pomnilnik);
    shmdt(pomnilnik2);

    /* Brisanje pomnilnikov */
    int brisi1;
    int brisi2;

    brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
    brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);

    if(brisi1 == 0) 
    {
        printf("Izbrisano!");
    } 

    if(brisi2 == 0) 
    {
        printf("Izbrisano!");
    } 

    return 0;
}/* Konec programa shm1a */


shm1b
#include <stdio.h>
#include <stdlib.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <unistd.h>

int main() 
{
    /* Definicija spremenljivk ipd.... */
    int skupniPomnilnik;
    int skupniPomnilnik2;
    int* pomnilnik;
    char* pomnilnik2;
    int i;

    /* Ustvarimo prvi pomnilnik */
    skupniPomnilnik = shmget(1059816, 0, 0);
    if(skupniPomnilnik < 0) 
    {
        perror("Napaka!");
        return(errno);
    }

    /* ustvarimo drugi pomnilnik */
    skupniPomnilnik2 = shmget(1059817, 0, 0);
    if(skupniPomnilnik2 < 0)
    {
        perror("Napaka!");
        return(errno);
    }

    /* Prvi kazalec */
    pomnilnik = (int*)shmat(skupniPomnilnik, (void*)0, 0);
    if(pomnilnik == (int*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }

    /* Drugi kazalec */
    pomnilnik2 = (char*)shmat(skupniPomnilnik2, (void*)0, 0);
    if(pomnilnik2 == (void*)-1) 
    {
        perror("Ni kazalca!");
        return -1;
    }	

    /* Skopiramo znake v pomnilnik 2 */
    for(i=0; i<20; i++)
    {
        pomnilnik2[i]='*';
    }    
    
    /* Ustavimo vrtavko */
    *pomnilnik = 1;	

    /* Odklopimo pomnilnika */
    shmdt(pomnilnik);
    shmdt(pomnilnik2);	

    /* Brisanje pomnilnikov */
    int brisi1;
    int brisi2;

    brisi1 = shmctl(skupniPomnilnik, IPC_RMID, 0);
    brisi2 = shmctl(skupniPomnilnik2, IPC_RMID, 0);

    if(brisi1 == 0) 
    {
        printf("Izbrisano!\n");
    } 

    if(brisi2 == 0) 
    {
        printf("Izbrisano!\n");
    } 
    return 0;
}/* Konec programa shm1b */


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211850 (697) galu
»

[C++] problem z binarnimi datotekami

Oddelek: Programiranje
9853 (718) mallard
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
656788 (5861) MrBrdo
»

skupni pomnilnik &#169; linux

Oddelek: Programiranje
62396 (2242) Keki
»

[C++ naloga] seznam

Oddelek: Programiranje
81321 (1321) BigWhale

Več podobnih tem