1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

2 Pipes - Problem

  • poochie
  • 10. November 2010 um 19:04
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • poochie
    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 :D

    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
    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
    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.

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

  • poochie
    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
    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
  • poochie
    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
    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.

  • poochie
    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.

  1. Datenschutzerklärung
  2. Impressum