Łącza nazwane. Fifo

0

Mam dwa proste programy klient-serwer:

Klient:

 #include <stdio.h>
#include <stdlib.h>
#define FIFO_FILE "MYFIFO"
int main(int argc, char *argv[])
{

	FILE *fp;
	if ( argc != 2 ) 
	{
	printf("Wywolanie: fifoclient [napis]\n");
	exit(1);
	}
	
	if((fp = fopen(FIFO_FILE, "w")) == NULL)
	{
	perror("fopen");
	exit(1);
	}
	
	
	fputs(argv[1], fp);
	fclose(fp);
	return(0);
}

Serwer :

 #include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/stat.h>

#define FIFO_FILE "MYFIFO"
int main(void)
{
	FILE *fp;
	char readbuf[80];
	/*tworzenie FIFO*/
	umask(0);
	mknod(FIFO_FILE, S_IFIFO|0666, 0);
	
	while(1)
	{
	fp = fopen(FIFO_FILE, "r");
	fgets(readbuf, 80, fp);
	printf("Orzymany tekst: %s\n", readbuf);
	fclose(fp);
	}
	
return(0);
}

Te dwa programy zapisuje i kompiluje w jednym katalogu. Po uruchomieniu serwer program się zawiesza jednak plik "MYFIFO" powstaje. Na początku chce "ręcznie " sprawdzić i zrozumiec jak to działa ale bez tego nie moge ruszyć dalej.

Moim ostatecznym celem jest stworzenie dwóch takich procesów, które uchwyt do łącza nazwanego uzyskują poprzez parametry funkcji execl od procesu macierzystego.
Nie wiem czy dobrze rozumiem ale czy powinienem zrobić dwa dodatkowe procesy w ten sposów:

Rodzic ( tu wywołyje execl(dziecko1) lub (dziecko2) )
| |
/ /
dziecko1(serwer) dziecko2(klient)

lub

Rodzic ( tu wywołyje execl(dziecko1) lub (wnuk) )
|
/
dziecko1(serwer)
|
/
wnuk(klient)

Mam nadzieje że moje drzewka są czytelne, czy mój tok myślenia jest poprawny ?

0

Z tego co tu wnioskuje.. niepotrzebnie robisz pętle, ona zawiesza ci program bo nie ma kiedy się skończyć... Skoro odczytujesz wartość z pliku, to raczej raz... czyli usuń pętle while i powinno działać...

Mam nadzieje, że pomogłem. ;)

Pozdrawiam, Mateusz.

0

Nie w tym rzecz. Wzoruje się na tym :
http://home.elka.pw.edu.pl/~edobkows/USUX/lab10_fun_sys/3_2.pdf
ale nie potrafie tego poprawnie uruchomić...

0

Wszystko działa jak należy, przynajmniej u mnie. Odpalam serwer, później klienta, serwer wypisuje napis...

0

Troche czasu mineło zrobiłem pewien progres i znowy natrafiłem na problem.

 


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main( int argc, char *argv[], char *env[] )
{
   pid_t my_pid, parent_pid, child_pid;
   int status;

/* get and print my pid and my parent's pid. */

   my_pid = getpid();    parent_pid = getppid();
   printf("\n Parent: my pid is %d\n\n", my_pid);
   printf("Parent: my parent's pid is %d\n\n", parent_pid);

/* print error message if fork() fails */
   if((child_pid = fork()) < 0 )
   {
      perror("fork failure");
      exit(1);
   }

/* fork() == 0 for child process */

   if(child_pid == 0)
   {  
 
   
      printf("\nChild: JESTEM NUMER RAZ!\n\n");
      my_pid = getpid();    parent_pid = getppid();
      printf("Child: my pid is: %d\n\n", my_pid);
      printf("Child: my parent's pid is: %d\n\n", parent_pid);

/////////////////////////////////////////////////////  
	   if((child_pid = fork()) < 0 )
             {
 	       perror("fork failure");
   	       exit(1);
	     }
	while(1)
	{///*****************
	    
	   if(child_pid == 0)
   	     {
   	     	
		printf("\n JESTEM SERWER  \n\n");
 	        my_pid = getpid();    parent_pid = getppid();
	        printf("Child: my pid is: %d\n\n", my_pid);
      		printf("Child: my parent's pid is: %d\n\n", parent_pid);
      		execl("/home/student/Desktop/zad9/ser", "ser", 0, 0);
      		printf("\nTESTEXXXXXXXXXXXXXXXXXXXTEXT\n\n");
      		
   
   	     }   
	     else
  	     {
      		printf("\n JESTEM KLIENT  \n\n");
    	        printf("Parent: my child's pid is: %d\n\n", child_pid);
    	     
                execl("/home/student/Desktop/zad9/kli", "kli", "napisss", 0);
   	        printf("\n Parent: DEAD RAZO 222222222222.\n \n ");
             }
           }///*************
	     
      _exit(1); 
 //////////////////////////////////////////////////     
   }
/*
 * parent process
 */
   else
   {
      printf("\nParent: NUMER JEDEN.\n\n");
      printf("Parent: my child's pid is: %d\n\n", child_pid);
      system("ps -acefl | grep ercal");  printf("\n \n");
      wait(&status); /* can use wait(NULL) since exit status
                        from child is not used. */
      printf("\n Parent:DEAD 1111111111\n \n ");
   }

   return 0;
}

Mniej wiecej działa tylko moim zadaniem jest wprowadzić ciag znaków do znaku "\r" i wysłac przez klienta do serwara ( serwer wypisuje) na razie zrobiłem to na sztywno i przekazuje "napisss". Chciałbym zapętlić te dwa procesy klient-serwer w nieskończonym while'u jak widać w kodzie, jednak w efekcie ten while jest nie zauważalny.

w funkjache execl wykorzystuje programy z 1 postu kli i ser.

0

Który while? Co to znaczy niezauważalny? Co się dzieje, a czego oczekujesz? Albo przynajmniej dałbyś paczkę z wszystkimi plikami i makefile'm żeby można było sprawdzić u siebie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1