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

Implementacia vlastnych rur v C – C / C++ – Fórum – Programujte.comImplementacia vlastnych rur v C – C / C++ – Fórum – Programujte.com

 

Jozef
~ Anonymní uživatel
61 příspěvků
3. 1. 2013   #1
-
0
-

Mam ulohu implementovat vlastne rury v jazyku C.. po zadani prikazu proces rurka proces2 rurka proces3 by sa mali vykonat za sebou bash skripty.. prikaz ej ekvivalent proces|proces2|proces3 kod vyzera nasledovne

void sprav(char* proces)
{
int status;
int pocet = 0; // pocet procesov aby som vedel kolko rur treba vytvorit(deskriptorov)
int pid;
char ahoj[50] = "/home/lasok/";
int i = 0;
int l = 0;
int z = 0;
int q = 0;
q=(i*2);

while(proces[q] != NULL)
{
  pocet++;
  i++;
  q=(i*2);
}
if(pocet == 0)
{
  printf("Nie je zadany ziadny proces\n");
  error(1);
}
pocet--;
int piped[(pocet)*2]; //pri kazdej potrebujem jeden na read a jeden na write

for(l = 0; l < (pocet); l++){ //vytvori deskriptory
         if(pipe(piped + l*2) < 0) {
              perror("error");
              exit(1);
         }
     }
pocet++;
int c = 0;
int g = 0;
q = 0;
while(g<pocet)
{
  pid = fork();
  if(pid == 0)
  {
   if((g+1) != pocet) //nie je posledny prikaz
   {
    if(dup2(piped[c + 1], 1) < 0){
                       perror("errorDup2");
                       exit(1);
                  }
   }
   if(c != 0) //nie je prvy prikaz
   {
                  if(dup2(piped[c-2], 0) < 0){
                       perror("dup2");
                       exit(1);

                  }
              }
   for(i = 0; i < 2*(pocet-1); i++){
                      close(piped[i]);
              }
   strcat(ahoj,proces[q]);
              if( execvp(ahoj,proces[q]) < 0 ){
    printf("Chyba pri spustani skriptu\n");
                      error(1);
              }
   memset(ahoj,NULL,sizeof(ahoj));
   strcpy(ahoj,"/home/lasok/");
  }else if(pid < 0){
   printf("Zlyhal fork\n");
   error(1);
  
  }
  z++;
  q=(z*2);
  g++;
  c+=2;
}
for(i = 0; i < 2 * pocet; i++){
         close(piped[i]);
     }

     for(i = 0; i < pocet + 1; i++)
       wait(&status);
}

parameter proces(su v nom olozene nazvy skriptov).. nech mu zadam hocijaky nazov vobec to nepadne vlatne nespravi nic.. neviem kde mam chybua  tak chcem poprosit dakoho ci by mi s tym pomohol 

Nahlásit jako SPAM
IP: 178.41.161.–
zlz
~ Anonymní uživatel
634 příspěvků
3. 1. 2013   #2
-
0
-

Přidej si tam nějaké výpisy stavu a hodnot ať vydíš, co se tam děje. Pak při kompilaci použij parametr -Wall a rozhodni se, jestli proces je char*, char**, nebo char*** a podle toho s ním pracuj.

Když na nic nepřijdeš, tak to zjednoduš a přeformátuj tak ať se v tom vyzná i někdo jiný než ty a vkládej kód pomocí funkce pro vložení zdrojového kódu (<?).

Nahlásit jako SPAM
IP: 80.188.216.–
3. 1. 2013   #3
-
0
-

#2 zlz
ty budeš mít hodně tvrdý pohled  

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jozef
~ Anonymní uživatel
61 příspěvků
3. 1. 2013   #4
-
0
-

ostatok som poopravoval. prepacte som tu novy. ono 2 roky sa ucim v jave a naraz potrebujem takuto vec spravit preto mam s tym vela problemov. cast ktora je chybna je od toho "while(g<pocet)" do konca kde vobec tie rury nejdu pre tie procesy.. opraveny je aj exec ked psutim viac ako ejden script tak nepusti vobec nic.. a prestudoval som o tych rurach dost ale stale nemozem tomu poriadne pochopit

Nahlásit jako SPAM
IP: 178.41.161.–
zlz
~ Anonymní uživatel
634 příspěvků
4. 1. 2013   #5
-
0
-

Mně se to takhle špatně čte, nevidím chybu. A nevím, co tam máš teď. Toto mi funguje (na linuxu)

void sprav(char *proglist[])
{
        int i, j, pocet = 0;

        for (i = 0; proglist[i]; i++)
                pocet++;

        if (pocet < 1)
                error(1, 0, "pocet %d", pocet);

        int pipecnt = pocet - 1;
        int pipes[pipecnt * 2];

        for (i = 0; i < pipecnt; i++) {
                if (pipe(pipes + i * 2) < 0)
                        error(1, errno, "pipe #%d", i);
        }

        for (i = 0; i < pocet; i++) {
                char *prog = proglist[i];
                printf("starting prog #%d [%s]\n", i, prog);
                pid_t pid = fork();

                if (pid < 0) {
                        error(1, errno, "fork #%d", i);
                } else if (pid == 0) {
                        int *currpip = &pipes[i * 2];
                        int *prevpip = currpip - 2;

                        if (i > 0) {
                                if (dup2(prevpip[0], 0) < 0)
                                        error(1, errno, "dup2 0 #%d", i);
                        }
                        if (i < pocet-1) {
                                if (dup2(currpip[1], 1) < 0)
                                        error(1, errno, "dup2 1 #%d", i);
                        }

                        for (j = 0; j < pipecnt * 2; j++) {
                                close(pipes[j]);
                        }

                        //execlp(prog, prog, NULL);
                        //error(1, errno, "prog #%d [%s]", i, prog);

                        exit(system(prog));
                }
        }

        for (i = 0; i < pipecnt * 2; i++) {
                close(pipes[i]);
        }

        for (i = 0; i < pocet; i++)
                wait(NULL);
}

...

sprav((char*[]){ "ls -l", "grep rwx", NULL });
Nahlásit jako SPAM
IP: 80.188.216.–
peter
~ Anonymní uživatel
4016 příspěvků
23. 11. 2014   #6
-
0
-

jozef  ako si to teda vyriesil ?

Nahlásit jako SPAM
IP: 195.168.237.–
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, 31 hostů

Podobná vlákna

Implementacia frontu v C — založil detony

Implementácia CMS — založil Anonymní uživatel

Implementacia AST — založil vitamin

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ý