Välkommen till linuxportalen.se!

Linuxportalen.se är Sveriges största och aktivaste webbplats för användare av öppen- och fri programvara.

Du besöker Linuxportalen.se som gäst vilket begränsar din möjlighet att använda webbplatsens alla funktioner. Genom att registera dig som medlem får du inte bara möjlighet att söka bland webbplatsens innehåll, skapa nya och delta i befintliga diskussioner, skapa din egen blogg, kommunicera med andra medlemmar genom privata meddelanden och delta i omröstningar. Du får också tillgång till Veckans Kadavro - en seriestrip unikt skapad för Linuxportalen.se!

Registeringen sker snabbt och är helt kostnadsfri - tveka inte, bli medlem idag!

Hjälp med forks (C programmering)

Har en uppgift jag sitter och försöker få att fungera ordentligt men det vill sig inte.

uppgiften är som följer:

Skriv ett C-program som skapar ett rör och en dotterprocess. Moderprocessen ska därefter läsa
in textsträngar från tangentbordet och skicka över dem i röret till dotterprocessen, som skriver
ut strängarna på skärmen igen.

4. När du fått ovanstående program att fungera, inför ytterligare ett rör och en dotterprocess. Den
nya processen ska läsa strängar från moderprocessen, vända dem bak-och-fram och skicka dem
vidare för utskrift till den andra dotterprocessen.

Problemen jag har är att jag inte får till utskriften av strängen som ska vara bakvänd. Jag vet inte riktigt vart felet ligger.

Skulle vara hemskt tacksam om någon orkar kika lite på koden och peka ut de mest uppenbara felen (jag ska kommentera koden och slänga upp den igen senare.)

BilagaStorlek
upg3.c.txt1.4 kB

Alternativ för kommentarvisning

Välj ditt önskade sätt att visa kommentarerna och klicka på "Spara" för att verkställa dina ändringar.

alberts bild

Jag kollade inte så noga. Men du skrev

 if (pid1 == -1 || pid2 == -1)

innan du anropar fork() för pid2. Vid tidpunkten för if-satsen är pid2 oinitierad. Dessutom har du en exit(EXIT_FAILURE); som avslutar programmet om första fork() misslyckas. Så det finns ingen anledning att ha en else direkt efter.

Lite längre ner har du koden för den andra barnprocessen

if (pid2 == 0)
{
...
--> exit(0);
}

Innan sista måsvingen borde det finnas en exit(Innocent. Annars kommer både den andra barnprocessen och den första barnprocessen köra samma kod (koden efter måsvingen ovan).

Samma sak borde även gälla för pid1 (som ligger "utanpå" pid2):

if (pid1 == 0)
{
...
--> exit(0);
}

Pröva att lägg in en exit(0); där också och se om det funkar bättre. Jag har inte testkört, men det borde bli lite bättre i alla fall Wink

mcnilss bild

För att du ska kunna prata mellan processerna måste du skapa ett rör. Jag saknar anrop till pipe.

http://www.die.net/doc/linux/man/man2/pipe.2.html finns ett exempel.

alberts bild

Dessutom kanske du borde använda waitpid() för att vänta in barnprocesserna. Jag är inte säker på om det behövs, men jag har en maggropskänsla av att du skulle kunna få en "broken pipe" error annars.

trappskis bild

Man tackar för hjälpen ska ta och titta lite mer på det där så fort tid medges och återkomma med resultat.

alberts bild

Det fanns två anrop till pipe(), precis i början. Men exemplet i länken du gav var väldigt bra. Det kan man använda som skelett och sedan fylla i funktionaliteten. I exemplet använde de _exit() för att avsluta barnprocessen. Jag har sett att de flesta brukar använda _exit() istället för exit() för att avluta barnprocesser som startats med fork() men jag är inte helt säker på varför.

sundmarks bild

Jag är mycket imponerad av det fina Svenska språket i dessa inlägg. Det är kul att se att det faktiskt går att använda ett "adekvat inhemskt vokabulär" för alla dessa datatermer. En fråga dock om "broken pipe" - kan man kalla det för "trasigt rör"? Jag har faktiskt sett det i någon felruta för en svensk översättning men undrar om man kan säga så.

--

Mikael Sundmark

 

Mikael Sundmark