[gelöst] Simulieren der Unix Pipe |



  • Hallo Leute,

    habe ein Problem mit dub2. Ich möchte/muss ein Programm schreiben dass die Pipe der Unix-Shell simuliert. In diesem Fall macht kindprozess 1 den ersten befehl und kindprozess2 den 2ten befehl. In diesem Beispiel who | sort.
    Jedoch bleibt mein Programm immer stecken.

    Hier mal den Code den ich schon produziert habe.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <time.h>
    
    #define READ 0
    #define WRITE 1
    
    void showHelp(void) {
    
    	printf("This Programm simulates the pipe command");
    	printf("\n");
    	printf("To use it :\n");
    	printf("arg1 :  first programm\n");
    	printf("arg2 :  second programm\n");
    	printf("\n");
    }
    
    /* main program */
    int main(int argc, char **argv) {
    
    	int file_pipes[2]; /* write result back to parent */
    	int status;
        //int data_processed;
    
    	pid_t pid_child1;
    	pid_t pid_child2;
    
    	//if(argc == 1 || argc > 3) {
      	 //printf("The function needs arguments or too much arguments");
         //showHelp();
      	 //exit(1);
      //}
    
    	/*checking if pipes are being created */
    	if(pipe(file_pipes) == 0) {
    
    		pid_child1 = fork();
    
    		if(pid_child1 == -1) {
    
    			printf("Fork failure child 1");
    			exit(EXIT_FAILURE);
    		}
    
    		/* child process 1 */
    		/* Programm A */
    		if(pid_child1 == 0) {  
    			printf("Child one process id : %d\n", getpid());
    
    			dup2(file_pipes[READ],0);
    			close(file_pipes[1]);
    			execlp("who","who",NULL);
    			perror("who");
    			close(file_pipes[0]);
    			exit(EXIT_SUCCESS);
    
    		}
    
    		/* parent process */
    		pid_child2 = fork();
    
    		if(pid_child1 == -1) {
    
    			printf("Fork failure child 2");
    			exit(EXIT_FAILURE);
    		}
    
    		/* child process 2 */
    		/* Programm B */
    		if(pid_child2 == 0) {
    			printf("Child one process id : %d\n", getpid());
    
    			dup2(file_pipes[READ],0);
                            dup2(file_pipes[WRITE],1);
    			execlp("sort","sort",NULL);
    			perror("sort");
    
    			exit(EXIT_SUCCESS);
    
    		}
    		/* parent process */
    
    		printf("Parent process %d\n", getpid());
    
    		waitpid(pid_child1, &status, 0);
    		waitpid(pid_child2, &status, 0);
    		exit(EXIT_SUCCESS);		
    	}
    	else 
    	{
    		printf("Error creating pipes");
    		exit(EXIT_FAILURE);
    	}
    
    }
    

    Dann hab ich noch ne Frage: Wie kann ich das Programm erweitern um beliebig viele Befehle auszuführen? 😕

    Gruß
    Christian



  • Du hast im ersten Prozess die Leseseite der Pipe auf stdin gebogen und die Schreibseite geschlossen. Sinnvoll wäre die Schreibseite auf stdout zu biegen, da who ja schreibt 😉

    Dann hast Du vermutlich einen Tippfehler nach dem zweiten fork, da wird nämlich die erste Pid auf -1 überprüft.

    Im zweiten Prozess stimmt das Verbiegen von stdin, aber Du biegst die Ausgabe gleichzeitig auf die Schreibseite der Pipe. Damit bekommt der zweite Prozess die Ausgabe von sich selbst zu lesen.

    Fazit:
    a) Im ersten Kind die Schreibseite auf 1 (besser: STDOUT_FILENO) dupen und die Leseseite schließen
    b) Im zweiten Kind die Leseseite auf 0 (besser: STDIN_FILENO) dupen und die Schreibseite schließen
    c) Am besten noch im Mutterprozess beide Seiten schließen



  • Hi LordJaxom!

    Danke für die Antwort. Nun funktioniert es. Jetzt versteh ich die verwendung von dup2! 😃 😃
    Thx
    Christian


Anmelden zum Antworten