Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
boro
Dołączył: 27 Lut 2007
Posty: 286
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Pon 1:13, 21 Kwi 2008 Temat postu: PS9 - programy |
|
|
Potok nazwany. Powiedzmy ze jest to niemal rozwiazanie zadania nr 1 z kartki ktora kobieta dala nam na ostatnich zajeciach. Fifo dziala w jedna strone jak narazie.
Instrukcja obslugi:
1. po wpisaniu nazwy pliku nalezy wcisnac ENTER
2. nalezy wklepac jakis znak i wcisnac ENTER
3. nalezy cieszyc sie z oczekiwanego wyniku ;)
Kod: | #include<stdlib>
#include<stdio>
#include<unistd>
#include<sys>
#include<sys>
#include<fcntl>
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
#define MAX 100
int main(void)
{
int writefd;
int readfd;
mkfifo("FIFO1",FILE_MODE);
mkfifo("FIFO2",FILE_MODE);
char buf1[MAX];
char buf2[max];
int pid=fork();
switch(pid)
{
case -1:{
printf("blad");
break;
}
default:{ //macierzysty
writefd=open("FIFO1",O_WRONLY); //zapis do kolejki fifo 1
readfd=open("FIFO2",O_RDONLY); //bedzie czytac z fifo 2
printf("podaj nazwe pliku\n");
scanf("%s\n",buf2);
write(writefd,buf2,MAX);
wait(NULL);
break;
}
case 0:{ //potomny
readfd=open("FIFO1",O_RDONLY); //potomny czyta z fifo 1
writefd=open("FIFO2",O_WRONLY); //potomny zapisuje do fifo 2
read(readfd,buf1,MAX);
printf("\nodczytano z kolejki: %s",buf1);
break;
}
}
unlink("FIFO1");
unlink("FIFO2");
return 0;
} |
Ostatnio zmieniony przez boro dnia Pon 1:15, 21 Kwi 2008, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
|
|
vbazyl
Dołączył: 06 Mar 2007
Posty: 94
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: Podlasie
|
Wysłany: Pon 2:52, 21 Kwi 2008 Temat postu: |
|
|
A jeśli nie spełnię 3 warunku to źle??
|
|
Powrót do góry |
|
|
wicher
Dołączył: 07 Mar 2007
Posty: 70
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: z 13 posterunku
|
Wysłany: Pon 12:28, 09 Cze 2008 Temat postu: |
|
|
Może ktokolwiek posiada rozwiązanie problemu śpiącego fryzjera na semaforach. Może być w Javie, w C, w C++ czy cokolwiek, byle było działające. Aha - opcjonalnie może być wielu fryzjerów.
|
|
Powrót do góry |
|
|
boro
Dołączył: 27 Lut 2007
Posty: 286
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Pon 13:59, 09 Cze 2008 Temat postu: |
|
|
trzeba dobrze poszukac, no i znajomosc angielskiego czasami tez pomaga. znalezione na jakiejs stronce. moze zadziala:
Kod: | /*
A Solution to Sleeping Barber problem using semaphores:
Solution uses a circular buffer with synchronized put and take methods.
Abstract classes ConsumerWithSemaphores and ProducerWithSemaphores
are inherited.
*/
import javax.swing.*;
import java.awt.*;
/*
Application creates a window -
packages javax.swing and java.awt are used
*/
import java.awt.event.*;
import java.util.*;
// Class to represent customers
class Customer
{
private int custNo;
public Customer(int no)
{
custNo = no;
}
public String toString()
{
return "Customer number " + custNo;
}
}
/*
* Class for barber = consumer of customers
*/
class Barber extends ConsumerWithSemaphores implements Runnable
{
private String name = "Semaphoric barber";
private int maxCutTime;
private JTextArea noteBoard;
private Random rndGen;
public Barber(CircularBufferWithSemaphores cb,int maxTime, JTextArea jta)
{
super(cb);
maxCutTime = maxTime;
noteBoard = jta;
rndGen = new Random();
}
protected void consume(Object obj)
{
// We get Objects from buffer -> must cast
Customer c = (Customer)obj;
noteBoard.append(name + " starts cutting the hair of " + c +"\n");
try
{
Thread.sleep(1000 + Math.abs(rndGen.nextInt(1000 * maxCutTime)) );
}
catch(InterruptedException ie)
{
Thread.currentThread().interrupt();
}
noteBoard.append(name + " stopped cutting the hair of " + c+"\n");
}
public void run()
{
Object obj;
while(!Thread.interrupted())
{
try
{
if( getNumStored() == 0 )
noteBoard.append(name + " sleeping.\n");
obj = takeObject();
consume(obj);
}
catch(InterruptedException ie)
{
break;
}
}
}
}
/*
* Class to produce customers for barber.
* Customer created at random intervals.
*/
class CustomerAppearance extends ProducerWithSemaphores implements Runnable
{
private int maxAppearTime;
private JTextArea noteBoard;
private int CustomerNum = 0;
private Random rndGen;
public CustomerAppearance(CircularBufferWithSemaphores cb,
int maxTime,JTextArea jta)
{
super(cb);
maxAppearTime = maxTime;
noteBoard = jta;
rndGen = new Random();
}
protected Object produce()
{
Object obj;
try
{
Thread.sleep(1000 + Math.abs(rndGen.nextInt(1000 * maxAppearTime)) );
}
catch(InterruptedException ie)
{
;
}
CustomerNum++;
obj = new Customer(CustomerNum);
return obj;
}
public void run()
{
Customer c;
while(true)
{
try
{
// Produce outputs objects -> must cast
c = (Customer)produce();
putObject(c);
noteBoard.append(""+ c + "arrived.+\n");
}
catch(InterruptedException ie)
{
break;
}
}
}
}
/*
* The main program with simple UI
* Customer producing thread is started with program
* Barber thread started and stopped from push button
* once stopped can not be restarted.
*/
public class BarberShop extends JFrame implements WindowListener,ActionListener
{
CustomerAppearance caQueue = null;
Barber theBarber;
Thread BarberThread;
Thread CustomerThread;
JButton startButton;
JTextArea threadNote = null;
CircularBufferWithSemaphores chairs = null;
public BarberShop()
{
// Set layout manager
getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT));
// Set window title
this.setTitle("Sleeping Barber program.");
//Set window size
this.setSize(470,400);
this.setResizable(false);
startButton = new JButton("Start/stop Barber");
getContentPane().add(startButton);
startButton.addActionListener(this);
threadNote = new JTextArea(18,40);
JScrollPane jScrollView = new JScrollPane(threadNote);
getContentPane().add(jScrollView);
try
{
chairs = new CircularBufferWithSemaphores(4);
}
catch(IllegalArgumentException iae)
{
System.exit(-1);
}
// Create threads for producer and consumer but
// do not yet start:
caQueue = new CustomerAppearance(chairs,3,threadNote);
theBarber = new Barber(chairs,5,threadNote);
BarberThread = new Thread(theBarber);
CustomerThread = new Thread(caQueue);
}
public static void main(String [] argv )
{
BarberShop bsProg = new BarberShop();
// Show window
bsProg.show();
// Add the window self as a listener!
bsProg.addWindowListener(bsProg);
// Start the customer producing thread
bsProg.CustomerThread.start();
}
/* These methods must be implemented because of interfac,
but they can be left empty */
public void windowOpened(WindowEvent e){ }
public void windowClosed(WindowEvent e) { }
public void windowActivated(WindowEvent e) { }
public void windowDeactivated(WindowEvent e) { }
public void windowIconified(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { }
// Only this method needs code!
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
// Only method of ActionListener
public void actionPerformed(ActionEvent ae)
{
if( ae.getSource() == startButton)
{
// If barber thread is running stop it - else start
if(BarberThread.isAlive())
{
BarberThread.interrupt();
}
else
{
BarberThread.start();
}
}
}
} |
Ostatnio zmieniony przez boro dnia Pon 18:32, 09 Cze 2008, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
wicher
Dołączył: 07 Mar 2007
Posty: 70
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: z 13 posterunku
|
Wysłany: Pon 15:13, 09 Cze 2008 Temat postu: |
|
|
boro napisał: | trzeba dobrze poszukac, no i znajomosc angielskiego czasami tez pomaga
|
Akurat ten kod programu umknął moim poszukiwaniom. Większość kodu który znalazłem była niekompletna - zawierała tylko wątki fryzjera i klienta plus semafory, a to znaleźć mogłem na prawie każdej stronie po wpisaniu w googlach "problem śpiącego fryzjera"
A tak wogóle to kod, który umieściłeś, wykazuje pewne braki. Brakuje m.in. klas:
- ConsumerWithSemaphores;
- ProducerWithSemaphores;
- CircularBufferWithSemaphores.
Najpewniejszym rozwiązaniem byłby kod w C chyba, że brakujące klasy do powyższego kodu są gdzieś dostępne na stronie skąd zaczerpnąłeś program. Dzięki za pomoc
Ostatnio zmieniony przez wicher dnia Pon 15:41, 09 Cze 2008, w całości zmieniany 3 razy
|
|
Powrót do góry |
|
|
boro
Dołączył: 27 Lut 2007
Posty: 286
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Pon 17:32, 09 Cze 2008 Temat postu: |
|
|
[link widoczny dla zalogowanych] -> sleeping barber problem
przeszukaj wyswietlone strony. moze znajdziesz to czego szukasz. zycze powodzenia ;)
Ostatnio zmieniony przez boro dnia Pon 17:32, 09 Cze 2008, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
wicher
Dołączył: 07 Mar 2007
Posty: 70
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: z 13 posterunku
|
Wysłany: Pon 18:30, 09 Cze 2008 Temat postu: |
|
|
Dzięki Boro. Wyszukiwać z google potrafię. Problem stanowiło te ponad 4 tysiące stron. Trochę to trwało, ale już znalazłem nawet w C gotowy program. No i oczywiście ten kod w javie, który ty zamieściłeś ale czy źle patrzyłem i nie zauważyłem, czy też nie ma tam tych brakujących klas.
PS znalazłem też cos o mikołajach i reniferach
Ostatnio zmieniony przez wicher dnia Pon 18:31, 09 Cze 2008, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
boro
Dołączył: 27 Lut 2007
Posty: 286
Przeczytał: 0 tematów
Ostrzeżeń: 0/5
|
Wysłany: Pon 18:33, 09 Cze 2008 Temat postu: |
|
|
teraz zostaje zrozumiec o co kaman w tym kodzie, ladna dokumentacja i max punktow wicher inkasujesz ;) co do reniferow to na trojeczke mam juz zrobione, wiecej mi chyba nie jest potrzebne. owocnej pracy zycze.
Ostatnio zmieniony przez boro dnia Pon 18:34, 09 Cze 2008, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
wicher
Dołączył: 07 Mar 2007
Posty: 70
Przeczytał: 0 tematów
Ostrzeżeń: 0/5 Skąd: z 13 posterunku
|
Wysłany: Pon 18:36, 09 Cze 2008 Temat postu: |
|
|
Dziękuję. A co do max punktów to akurat tyle nie potrzebuję. Wystarczy 15-20 pkt; tak w sam raz żeby zaliczyć i mieć z głowy(przynajmniej do nastepnego semestru).
|
|
Powrót do góry |
|
|