Implementacja potoków

Potrzebujesz pomocy z C, C++, perl, python, itp.
bedziner
Posty: 1
Rejestracja: 21 stycznia 2012, 19:15

Implementacja potoków

Post autor: bedziner »

Witam.
Mam problem z implementacją potoków na łączu nienazwanym. Zacząłem od:

Kod: Zaznacz cały

ls -l | tail -4 | tail -2
Z jednym potokiem nie ma problemu, z dwoma nie wychodzi. Meczę się z tym x dni.
Wypożyczyłem odpowiednią literaturę, postępuję według schematu, nie mam pojęcia co może być nie tak. Co robię źle?
http://wklej.org/id/867415/

Kod: Zaznacz cały

#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void) 
{
	int lacze_1[2];
	int lacze_2[2];
	pipe(lacze_1);
	pipe(lacze_2);
	pid_t x = fork();
	if (x == 0) 
	{ 
		dup2(lacze_1[1], STDOUT_FILENO);
		close(lacze_1[0]);
       	execl("/bin/ls", "ls", "-l", "../UNIX", NULL);
   	}
   	else
   	{
		waitpid(x, NULL, 0);
		pid_t x2 = fork();
	   	if(x2 == 0)
	   	{
			dup2(lacze_1[0], STDIN_FILENO);
			close(lacze_1[1]);
			dup2(lacze_2[1], STDOUT_FILENO);
			close(lacze_2[0]);
              	char **adres = malloc(sizeof(char *)*10);
                     adres[0] = "tail";
	           	adres[1] = "-4";
		   	adres[2] = NULL;
		  	execvp(adres[0], &adres[0]);
	  	}
	  	else
		{
			pid_t x3 = fork();
			if(x3 == 0)
			{
				dup2(lacze_2[0], STDIN_FILENO);
				close(lacze_2[1]);
				char **trzeci = malloc(sizeof(char *)*10);
				trzeci[0] = "tail";
				trzeci[1] = "-2";
				trzeci[2] = NULL;
				execvp(trzeci[0], &trzeci[0]);
			}
			else
			{
			}
		}
   	}
    return 0;
}
Czocher
Beginner
Posty: 140
Rejestracja: 26 maja 2007, 23:19

Post autor: Czocher »

1. Dużo malloców, żadnych free,
2. Możnaby zaimportować stdlib.h, w nim jest zdefiniowany malloc, bez tego kompilator musi się domyślać o co chodzi,
3. Deklarowanie zmiennych nie na początku maine'a jest dostępne w C++, w C niestety nie,
4. Do debuggowania potoków przydaje się taki kod:

Kod: Zaznacz cały

dup2(STDOUT_FILENO, STDIN_FILENO);
Powoduje on przekazanie całego wejścia procesu na wyjście, od razu widać jaki jest błąd.
W moim przypadku tail nie wiedział co właściwie ma tailować, z resztą wystarczy zauważyć, że komenda:

Kod: Zaznacz cały

ls -l | tail -4 | tail -2
Nie robi tego co powinna, tzn nie pokazuje ostatnich dwóch linii plików w katalogu o ile to chciałeś by czyniła. Nie jestem pewien co ten program miałby właściwie robić, mam parę podejrzeń ale nie mogę mieć pewności.

Lepiej spróbuj coś ala:

Kod: Zaznacz cały

echo 2+2 | bc
Tutaj natychmiast widać wynik i to czy jest poprawny.
Pozdrawiam
ODPOWIEDZ