Strona 1 z 1

pomozcie znalezc blad

: 23 listopada 2007, 23:33
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??

: 24 listopada 2007, 08:42
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).

: 24 listopada 2007, 11:44
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????