Semaforove procesy v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Semaforove procesy v C – C / C++ – Fórum – Programujte.comSemaforove procesy v C – C / C++ – Fórum – Programujte.com

 

10. 12. 2012   #1
-
0
-

Caute mam taky problem, mam urobit toto :Usporiadané procesy:Napíšte s použitím semaforov programovú štruktúru piatich procesov, ktorých vykonanie bude usporiadané v čase podľa nasledujúceho orientovaného grafu. Každý nasledujúci proces sa spustí až vtedy, keď sa jeho predchodca skončil.Navrhnite vhodné činností procesov, aby z výstupu bolo zrejme, že poradie vykonávania bolo dodržané.

Neviem vsak uplne ako nato, kedze semafory sme presli len tak ako z vlaku, a neviem ako spravim procesy, ktore budu bezat subezne. mohli by ste mi s tym pomoc/poradit? Prikladam hierarchicky obrazok.

Nahlásit jako SPAM
IP: 158.193.83.–
vitamin+8
Grafoman
10. 12. 2012   #2
-
0
-

#1 lukass111
Najprv napis aky pouzivas OS. 

Nemas nahodou pouzit 5 vlakien v 1 procese?

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
10. 12. 2012   #3
-
0
-

#2 vitamin
nie nie toto je presne zadanie 

Nahlásit jako SPAM
IP: 158.193.83.–
vitamin+8
Grafoman
10. 12. 2012   #4
-
0
-

#3 lukass111
C neobsahuje standartne funkcie na pracu s procesmi, takze musis napisat co mas za OS (na linuxe sa to napr riesi cez fork()...).  

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
10. 12. 2012   #5
-
0
-

no samozrejme, na tomto predmete pracujeme v linuxe. vies mi s tym pomoct??

Nahlásit jako SPAM
IP: 158.193.83.–
liborb
~ Redaktor
+18
Guru
10. 12. 2012   #6
-
+1
-
Zajímavé

Třeba takto ... vytvoříš si z hlavního programu 5 procesů a 6 semaforů. Každému procesu přidělíš jeden semafor, jenom proces P5 dostane 2. Každý proces bude na začátku čekat na nahození svého semaforu, proces P5 bude čekat na nahození obou. V hlavní programu následně nahodíš semafor pro proces P1. Na konci procesu P1 nahodíš semafor pro proces P2 a P4. Na konci procesu P2 nahodíš semafor pro P3. Na konci P3 nahodíš jeden pro P5 a na konci P4 nahodíš druhý pro P5.

Nahlásit jako SPAM
IP: 188.75.135.–
10. 12. 2012   #7
-
0
-

nikto nic?? odmena ista

Nahlásit jako SPAM
IP: 158.193.83.–
zlz
~ Anonymní uživatel
634 příspěvků
10. 12. 2012   #8
-
0
-

Jaké nic? Nepiš si o radu, když na to dlabeš a rovnou to dej do inzerce.

Nahlásit jako SPAM
IP: 80.188.216.–
liborb
~ Redaktor
+18
Guru
10. 12. 2012   #9
-
0
-

Procesy si vytvoříš přes fork. Pro práci se semafory jsou funkce sem_open, sem_wait, sem_post. Prioritu procesů řešit nemusíš.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.211.–
10. 12. 2012   #10
-
0
-

je mi to jasne, mam klient.c a server.c(co je vlastne hlavny program), problem mam v tom, ze neviem tym procesom priradit semafor a potom v hlavnom programe zavolat tie semafory nech sa vykonavaju procesy v spravnom poradi . mam nieco ako

srand(time(NULL));

  buffer = 100;
  shared_data->text = buffer;
  printf("Blablaba...\n");
  sem_sig(semP);
  printf("blabla...\n");

Nahlásit jako SPAM
IP: 158.193.83.–
zlz
~ Anonymní uživatel
634 příspěvků
10. 12. 2012   #11
-
0
-

Takže ty klienty spouštíš přes nějaký exec*() ? Tak třeba každému můžeš dát název semaforu/ů do argv

execl("./klient", "./klient", "mujsem1", NULL);
...
Nahlásit jako SPAM
IP: 80.188.216.–
10. 12. 2012   #12
-
0
-

nie nie normalne 2 dialogove okna(putty) skolsky server, najskor sa spusti server.c, potom klient.c a zosynchronizuju sa

Nahlásit jako SPAM
IP: 158.193.83.–
zlz
~ Anonymní uživatel
634 příspěvků
11. 12. 2012   #13
-
+2
-
Zajímavé

Já tomu nějak nerozumím. Jednoduše by to šlo třeba takhle (bez kontrol chyb):

#define ASZ(x) (sizeof (x) / sizeof (x)[0])

void proc(char id, sem_t *waitsem[], sem_t *postsem[])
{
        int i;

        for (i = 0; waitsem[i]; i++) sem_wait(waitsem[i]);

        for (i = 0; i < 5; i++) {
                printf("%c", id); fflush(stdout);
                sleep(1);
        }

        for (i = 0; postsem[i]; i++) sem_post(postsem[i]);
}

pid_t start(char id, char *wait, char *post)
{
        pid_t pid;

        if ((pid = fork()) == 0) {
                int i;
                char *tok, *saveptr;
                sem_t *wsem[5] = {0}, *psem[5] = {0};

                wait = strdup(wait); post = strdup(post);
                for (i = 0, tok = strtok_r(wait, ",", &saveptr); tok; tok = strt
                        wsem[i] = sem_open(tok, 0);
                for (i = 0, tok = strtok_r(post, ",", &saveptr); tok; tok = strt
                        psem[i] = sem_open(tok, 0);

                proc(id, wsem, psem);

                for (i = 0; wsem[i]; i++) sem_close(wsem[i]);
                for (i = 0; psem[i]; i++) sem_close(psem[i]);

                exit(0);
        }

        return pid;
}

int main(int argc, char *argv[])
{
    struct { char *name; sem_t *sem; } semlist[] = {
        { "/xx01", NULL },
        { "/xx12", NULL },
        { "/xx23", NULL },
        { "/xx35", NULL },
        { "/xx14", NULL },
        { "/xx45", NULL }
    };

    struct { pid_t pid; char *wait, *post; } proclist[] = {
        /*P1*/ { -1, "/xx01", "/xx12,/xx14" },
        /*P2*/ { -1, "/xx12", "/xx23" },
        /*P3*/ { -1, "/xx23", "/xx35" },
        /*P4*/ { -1, "/xx14", "/xx45" },
        /*P5*/ { -1, "/xx35,/xx45", ""}
    };

    int i;

    for (i = 0; i < ASZ(semlist); i++)
        semlist[i].sem = sem_open(semlist[i].name, O_CREAT|O_EXCL, 0777, 0);

    for (i = 0; i < ASZ(proclist); i++)
        proclist[i].pid = start('1'+i, proclist[i].wait, proclist[i].post);

    sem_post(semlist[0].sem);

    for (i = 0; i < ASZ(proclist); i++)
        waitpid(proclist[i].pid, NULL, 0);

    for (i = 0; i < ASZ(semlist); i++) {
        sem_close(semlist[i].sem);
        sem_unlink(semlist[i].name);
    }

    return 0;
}
Nahlásit jako SPAM
IP: 80.188.216.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 41 hostů

Podobná vlákna

Procesy — založil markez

Procesy na inom pocitaci — založil bruenor

Dva nezávislé procesy — založil aerov

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý