Problem med C, fork och pipe...

Avdelningen för programmering, nätverk samt alternativa OS.
Post Reply
User avatar
trappski
Posts: 2310
Joined: 2004-09-25 23:53:15
Location: Örebro

Problem med C, fork och pipe...

Post by trappski »

Inte världens upplyftande rubrik kanske...
Nåväl, sitter här med en uppgift som jag inte får helt kläm på.
Jag ska skriva ett program som skapar en fork. Huvudprocessen ska läsa in en textsträng skriva den till en pipe som läses av "barnet" som sedan ska skriva ut den på skärmen...
Programmet fungerar men inte helt...
Efter man matat in första strängen skriver programmet ut den precis som den ska. Programmet ska sdå kriva ut "Skriv en sträng: " igen och vänta på ny inmatning. Detta händer inte, istället hoppar den helt enkelt över allting och bara står och väntar på en ny inmatning tills jag matat in en ny sträng. Då skriver den ut "Skriv en sträng: " igen samtidigt som den skriver ut den ny strängen precis som den ska. Den står också och väntar på inmatning precis efter den nyss utskrivna strängen.

Hoppas jag öht gör mig förstådd.


Här är koden för det jag skrivit.

Code: Select all

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include "vt200.h"



int main()
{
   int fd[2],pid,n;
   char buf[100],str[100];
   
   pipe(fd);
   pid = fork();
   CLRSCR;
   if (pid1 == -1)
   {
	printf("Error creating fork, Exiting!");
	exit(EXIT_FAILURE);
     
     
   }
   
   else if(pid == 0)
   {
      while(1)
      {	   
	 n = read(fd[0],buf,sizeof(buf));
	 POS(21,20);
	 printf("Du skrev: %s", buf);
	 fflush(stdout);
      }
    
  }
   
   else
   {  
      while(1)
	{	   
	   POS(20,20);
	   printf("Skriv en sträng: ");
	   if (scanf("%s",&str) != EOF)
	   {
		
	   fflush(stdout);
	     n = write(fd[1],str,sizeof(str));
	   }
	   
	   else
	   {
	      kill(pid,SIGTERM);
	      exit(EXIT_SUCCESS);
	   }
	   
       }      
   }

   return 0;
}

User avatar
Moonsky
Posts: 2256
Joined: 2005-09-21 15:52:41

Post by Moonsky »

Det där med forks och threads kan vara lite klurigt. Sist jag provade på forks, så kraschade datorn. :p
jstrom
Posts: 1732
Joined: 2002-05-28 22:18:35
Location: Göteborg
Contact:

Post by jstrom »

Kan det vara att din console är linebuffered tro? Om jag tolkade rätt så:

Skriv en sträng: <du skriver nått>[ENTER]
Du skrev: <det du precis skrev>

sen händer inget mer tills du skirver nått igen och trycker enter då kommer

Skriv en sträng: <det du precis skrev i blindo>
Du skrev: <ja det du nu skrev>

upp.. förstår jag rätt? testa att slänga på ett \n i slutet på alla printf så ser du om det funkar.. eller stäng av linebuffering på stdout men det är lite mer utmaning så testa \n först ;)
User avatar
trappski
Posts: 2310
Joined: 2004-09-25 23:53:15
Location: Örebro

Post by trappski »

Jag löste problemet på ett relativt "enkelt" sätt...
jag ändrade

Code: Select all

if (scanf("%s",&str) != EOF) 
       { 
        
       fflush(stdout); 
         n = write(fd[1],str,sizeof(str)); 
       } 
till

Code: Select all

if (scanf("%s",&str) != EOF) 
       { 
       sleep(1);
       fflush(stdout); 
         n = write(fd[1],str,sizeof(str)); 
       } 
Post Reply