Komunikacja między procesami C /synchronizacja procesów

0

Witam, potrzebuję pomocy związanej z synchronizacją 2 procesów, klienta oraz serwera.
Program ma działać następująco: Klient wypełnia tablicę, w pamięci współdzielonej liczbami losowymi i wysyła zapytanie do serwera o posortowanie, serwer po przyjęciu zapytania, sortuje dane i wysyła odpowiedź do klienta o powodzeniu operacji, klient odbiera wiadomośc i wyświetla posortowane dane.
Zaciąłem się na etapie synchronizacji, pamięć współdzielona działa ale program uzupełnia i sortuje w losowych momentach.
Nie wiem za bardzo w jaki sposób się za to zabrać, przede wszystkim zastanawiam się w jaki sposób przekazać wiadomości między procesami, jestem w temacie kompletnie zielony.
Planowałem synchronizację zrealizować na semaforach, a do komunikacji między procesami również wykorzystać pamięć współdzieloną która będzie nimi sterować.
Domyślam się, że można to zrobić zdecydowanie lepiej i szybciej, w związku z tym liczę na małą podpowiedź.
poniżej kod, jest tam kilka śmieci

#include stdio.h
#include stdlib.h
#include time.h
#include systypes.h
#include unistd.h
#include string.h
#include fcntl.h
#include sysmman.h
#include sysipc.h
#include syssem.h
#include semaphore.h
#include sysshm.h
#include sysmman.h
#include sysstat.h
#include fcntl.h
#include errno.h
#include time.h
int main() {

   int tab[5];
    sem_t mut;
    int fd;
    //SEMAFOR
    sem_t s;
    sem_init(&s, 0, 1);

    if(fork()==-1){
        printf(Brak zasobów do rozwidlenia procesu!n);
        return 0;
    }
else if(fork()!=0) {
        sem_wait(&s);
        printf(tatan);

        
      //  otwieranie pamięci danych
        fd = shm_open(shared_memmory_object,O_RDWR , 0777);
       // mapowanie
        int addr = (int) mmap(0, 10sizeof(int),PROT_READPROT_WRITE,MAP_SHARED,fd,0);

        sort
        for(int i =0;i10;i++)
        {
            for(int j=0;j10 -1;j++)
            {
                if(addr[j]addr[j+1])
                {
                    int temp =addr[j];
                    addr[j]=addr[j+1];
                    addr[j+1]=temp;
                }
            }
        }
        print
        for (int i = 0; i  10; i++) {
            printf(%d , addr[i]);
        }
        printf(n);

        //zamykam pamięć
        munmap(addr,10sizeof(int));
        close(fd);
        sleep(1);


        }else{
            printf(synn);

            //tworzenie pamięci danych
            fd = shm_open(shared_memmory_object,O_RDWR  O_CREAT, 0777);
            //wielkość obiektu pamięci
            ftruncate(fd,10sizeof(int));
           // mapowanie
            int addr = (int) mmap(0, 10sizeof(int),PROT_READPROT_WRITE,MAP_SHARED,fd,0);
           // wypełniam pamięć
            srand(time(NULL));
            for (int i = 0; i  10; i++) {
                addr[i] = rand()%100;
            }
            print
            for (int i = 0; i  10; i++) {
                printf(%d , addr[i]);
            }
            printf(n);
        }

    return 0;
}
1

Zacznij od minimalnego kodu, który w ogóle ma prawo się skompilować, przecież to nie jest nawet syntaktycznie poprawne C.

0

@kq: program się kompiluje i działa, zdaję sobie sprawę, że jest tu dużo do poprawy, wrzuciłem kod poglądowo żeby wiadomo było mniej więcej o co mi chodzi

1

Na pewno wrzuciłeś ten sam kod?
https://wandbox.org/permlink/pdyIfXjo7Oh7saLK

  • include'y bez <> lub "",
  • randomowo wstawione "sort" i "print"
        sort
        for(int i =0;i10;i++)
        {
            for(int j=0;j10 -1;j++)
            {
                if(addr[j]addr[j+1])
                {
                    int temp =addr[j];
                    addr[j]=addr[j+1];
                    addr[j+1]=temp;
                }
            }
        }
        print
        for (int i = 0; i  10; i++) {
            printf(%d , addr[i]);
        }
0

tak, dokładnie ten sam, ucięło komentarze przed print i sort

0
Szczur son napisał(a):

tak, dokładnie ten sam, ucięło komentarze przed print i sort

kod ze screenshota jest inny od wklejonego!
gdzieś podczas copy paste uciekły wszystkie znaki cytowania " i mnóstwo innych rzeczy.
Jak tyś to zrobił? Popsuł ci się clipboard?

0

@MarekR22: nie mam pojęcia jak to sie stało, zaraz wrzucę poprawioną wersję

0

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
int main() {

int tab[5];
sem_t mut;
int fd;
//SEMAFOR
sem_t s;
sem_init(&s, 0, 1);

if(fork()==-1){
    printf("Brak zasobów do rozwidlenia procesu!\n");
    return 0;
    
}else if(fork()!=0) {
    printf("tata\n");

    //otwieranie pamięci danych
    fd = shm_open("/shared_memmory_object",O_RDWR , 0777);
    //mapowanie
    int *addr = (int*) mmap(0, 10*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

    //sort
    for(int i =0;i<10;i++)
    {
        for(int j=0;j<10 -1;j++)
        {
            if(addr[j]>addr[j+1])
            {
                int temp =addr[j];
                addr[j]=addr[j+1];
                addr[j+1]=temp;
            }
        }
    }
    //print
    for (int i = 0; i < 10; i++) {
        printf("%d ", addr[i]);
    }
    printf("\n");

    //zamykam pamięć
    munmap(addr,10*sizeof(int));
    close(fd);
    sleep(1);


    }else{
        printf("syn\n");

        //tworzenie pamięci danych
        fd = shm_open("/shared_memmory_object",O_RDWR | O_CREAT, 0777);
        //wielkość obiektu pamięci
        ftruncate(fd,10*sizeof(int));
        //mapowanie
        int *addr = (int*) mmap(0, 10*sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
        //wypełniam pamięć
        srand(time(NULL));
        for (int i = 0; i < 10; i++) {
            addr[i] = rand()%100;
        }
        //print
        for (int i = 0; i < 10; i++) {
            printf("%d ", addr[i]);
        }
        printf("\n");
    }

return 0;

}

0

Popracuj nad kodem, bo jest średniej jakości (chociażby nie masz tutaj żadnej dodatkowej funkcji, a zdecydowanie by się przydały).
A co do meritum, ja bym to zrealizował tak:
Masz sobie semafor flagę. Serwer zaczyna od wait(sem), klient losuje dane, robi post(sem) a potem zaraz czeka (wait(sem)), z kolei serwer jak się doczeka to sortuje dane, i po skończonej pracy podnosi semafor.
Żeby to wszystko działało, musisz odpowiednio stworzyć semafor, tak żeby mógł przebywać w pamięci dzielonej (tzn sem_init(&sem, 1, 0)).

0

@enedil: czyli tak na prawdę jeden semafor wystarczy w tym przypadku i oba procesy będą sobie go nawzajem "podnosić/opuszczać", czyli tak na prawdę podnoszenie/opuszczenie będzie wymianą tych wiadomości między serwerem a klientem?
kod oczywiście będzie w finalnej wersji poprawiony :)

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