pomozcie znalezc blad

Potrzebujesz pomocy z C, C++, perl, python, itp.
jarman
Beginner
Posty: 225
Rejestracja: 01 lipca 2007, 11:41
Lokalizacja: Zgora / Wroc

pomozcie znalezc blad

Post autor: jarman »

witam!
Na zajeciach z programowania wspolbierznego zadali mi 2 programy... klient-serwer.
Nie wiem dlaczego ale wieszaja sie one w tym samym miejscu... moze wkleje listing z serwera:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
#include <string.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/stat.h>

#define FIFO_NAME "kolejka_read" 
#define FIFO_NAME2 "kolejka_write"

int main(int argc, char *argv[])
{
	char bufor[256]; 	// bufor pamietajacy wpisane znaki
	int i, fifo_read, fifo_write, znalazlem, status;
	
	printf("dupa");

	mknod(FIFO_NAME, S_IFIFO | 0666, 0);		//tworzenie plikow fifo przez serwer z odpowiednimi prawami dostepu
	mknod(FIFO_NAME2, S_IFIFO | 0666, 0);

	fifo_read = open( FIFO_NAME, O_RDONLY );	// otwarcie pliku kolejki na rzecz czytania danych klienta
	fifo_write = open( FIFO_NAME2, O_WRONLY );	// otwarcie pliku kolejki do zapisywania

	printf( "Oczekiwanie na dane od klienta\n" );
	
	do
	{
		if( (status = read(fifo_read, bufor, 256)) == -1 )
			perror( "read error" );
		else
		{
			printf( "Odczytano %d bajtow od klienta tresci:\n %s \n Przytapiono do wprowadzania zmian\n", status, bufor );
			bufor[status] = '\0';
			for( i=0; i<256; i++ )
				if( islower(bufor[i]) )
					bufor[i] = toupper( bufor[i] );
				if ( isupper(bufor[i]) )
					bufor[i] = tolower( bufor[i] );	
			
			if ( (status = write(fifo_write, bufor, strlen(bufor))) == -1 ) // zapis zmienionych danych 
                		perror("write error");
		}	
	} while( status );
}
program za kazdym razem wywala sie (tzn. nie jakis error, tylko wiecznie wykonuje) ta linijke:

Kod: Zaznacz cały

fifo_read = open( FIFO_NAME, O_RDONLY );	// otwarcie pliku kolejki na rzecz czytania danych klienta
pomozecie??
fabix
Posty: 61
Rejestracja: 26 sierpnia 2006, 13:31

Post autor: fabix »

Jasne że tak się dzieje bo on nie wykonuje tej linijki tak długo, tylko tworzy to i blokuje bieżący wątek. Musisz w różnych wątkach, a nie w jednym. Nie pamiętam dokładnie jak to tam było. Polecam:

Kod: Zaznacz cały

man mknod
man mkfifo
man open
man read
man write
A ja sie kiedyś męczyłem na jakiś zajęciach z napisaniem klient-serwer korzystając z fifo (pipe). Kompletna bzdura, ale dało się napisać.
Rezultat tu. Myślę, że się przyda bo zasada jest bardzo podobna.
Trzeba odpalić kilka instancji programu (może być na tej samej maszynie).
jarman
Beginner
Posty: 225
Rejestracja: 01 lipca 2007, 11:41
Lokalizacja: Zgora / Wroc

Post autor: jarman »

Cos mi sie wydaje ze nie o watki tutaj chodzi. Chodzi o skomunikowanie 2 procesow.
Wszystko zrobilem zgodnie z TYM PRZYKLADEM i teraz sam juz nie wiem co jest zle????
ODPOWIEDZ