1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

2 Pipes - Problem

  • poochie
  • 10. November 2010 um 19:04
  • Unerledigt
  • poochie
    4
    poochie
    Mitglied
    Punkte
    105
    Beiträge
    14
    • 10. November 2010 um 19:04
    • #1

    Erst mal Hallo ist mein erster Beitrag hier.
    Werde wohl in nechster Zukunft öfters hier posten wies aussieht :grinning_squinting_face:

    Also wir behandeln gerade Pipes und sollen dafür in C die Linux-Shell anweisung nachbilden:
    "ps aux | sort -n | head -10"
    Denke das dürfte eigentlich ganz einfach sein aber beim kompilieren kommt schon ein fehler (head: Fehler beim Lesen von „Standardeingabe“: Bad file descriptor
    ), hoff kann mir jemand helfen, bin schon am verzeweifeln:

    Code
    #include <unistd.h>
    #include<stdio.h>
    
    
    
    
    int main(){
    
    
    	int ret,pid,pid2,fd[2],fd2[2];
    	pipe(fd);
    	pipe(fd2);
    	pid = fork();
    	if (pid==0) {
    		dup2(fd[1], STDOUT_FILENO);
    		close(fd[0]);
    		close(fd[1]);
    		ret=execlp ("ps", "ps", "aux", NULL);
    	} else {	
    			pid2=fork();
    			if(pid2==0)
    			{
    				dup2(fd[0], STDIN_FILENO);
    				dup2(fd2[1], STDOUT_FILENO);
    				close(fd[0]);
    				close(fd[1]);
    				close(fd2[0]);
    				close(fd2[1]);
    				ret=execlp ("sort", "sort", "-n", NULL);
    			}
    			else {
    				dup2(fd2[1], STDIN_FILENO);
    				close(fd[0]);
    				close(fd[1]);
    				ret=execlp ("head", "head", "-10", NULL);			
    			}
    		}
    	return 0;
    }
    Alles anzeigen

    Einmal editiert, zuletzt von poochie (10. November 2010 um 19:38)

  • poochie
    4
    poochie
    Mitglied
    Punkte
    105
    Beiträge
    14
    • 10. November 2010 um 19:37
    • #2

    und noch ne zusatzfrage:
    was macht diese shellanweisung:
    wäre nett wenn mir hier noch jemand weiterhelfen könnte

    Bash
    #!/bin/bash
    :(){ :|:& };:
  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 10. November 2010 um 19:46
    • #3
    Zitat von poochie

    und noch ne zusatzfrage:
    was macht diese shellanweisung:
    wäre nett wenn mir hier noch jemand weiterhelfen könnte

    Bash
    #!/bin/bash
    :(){ :|:& };:

    fork-bomb.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

    Einmal editiert, zuletzt von Kampi (10. November 2010 um 19:50)

  • poochie
    4
    poochie
    Mitglied
    Punkte
    105
    Beiträge
    14
    • 10. November 2010 um 20:01
    • #4

    hmm, wo werden denn da neue prozesse erstellt?
    edit: aso hab nachgeschaut war schon ne riesen hilfe danke

    könntest du mir vielleicht bei der erstenhelfen,
    ich hab da versucht 2 pipes zu erstellen und die ausgabe der ersten pipe in die 2te zu geben...

    Einmal editiert, zuletzt von poochie (10. November 2010 um 20:04)

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 10. November 2010 um 21:04
    • #5

    fuer mehr und schoeneren code bin ich gerade nicht zu begeistern... HTH

    C
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    
    
    #define CHILD (0)
    #define READEND (0)
    #define WRITEEND (1)
    
    
    int main(int argc, char **argv) 
    {
       pid_t pid1;
       int pipe1[2];
    
    
       pipe(pipe1);
       pid1 = fork();
       if (pid1 == -1) /* fork failed */
       {
          exit(EXIT_FAILURE);
       }
    
    
       if (pid1 == CHILD)
       {
          close(pipe1[WRITEEND]);
          dup2(pipe1[READEND], STDIN_FILENO);
          close(pipe1[READEND]);
          execlp("wc", "wc", "-l", (char *) NULL);
          perror("wtf"); exit(EXIT_FAILURE);
       }
       else /* parent */
       {
          close(pipe1[READEND]);
          dup2(pipe1[WRITEEND], STDOUT_FILENO);
          close(pipe1[WRITEEND]);
          execlp("ls", "ls", "-1", (char *) NULL);
          perror("wtf"); exit(EXIT_FAILURE);
       }
       return 0;
    }
    Alles anzeigen

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • poochie
    4
    poochie
    Mitglied
    Punkte
    105
    Beiträge
    14
    • 10. November 2010 um 21:19
    • #6

    danke erstmal aber du hast in diesem code die shell- Anweisung wc -l | ls -l nachgebildet, das problem was ich habe ist eben das ich 2 pipes benutzen muss für meine anweisung ("ps aux | sort -n | head -10")....

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    Punkte
    7.828
    Beiträge
    1.468
    • 10. November 2010 um 21:32
    • #7
    Zitat von poochie

    danke erstmal aber du hast in diesem code die shell- Anweisung wc -l | ls -l nachgebildet,

    noe.
    a) ist es "ls -1" (eins, nicht 'l')
    b) ist es "ls -1 | wc -l" und nicht anders rum

    Zitat von poochie


    das problem was ich habe ist eben das ich 2 pipes benutzen muss für meine anweisung ("ps aux | sort -n | head -10")....

    richtig. aber was einmal geht, geht auch ein zweites mal... das solltest du schon mit ein wenig nachdenken schaffen.

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • poochie
    4
    poochie
    Mitglied
    Punkte
    105
    Beiträge
    14
    • 10. November 2010 um 21:38
    • #8

    hm ja danke erstmal, werd ich nochmal versuchen, wie du in meinem ausgangspost siehst hab ich das ja schon versucht (neuen prozess starten in else anweisung und nochmal das gleiche)...

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung