public int polecenia() { int stop = 0, bre = 0; while (true) { Console.Write("Komenda:"); string com; com = Console.ReadLine(); string[] comenda = com.Split(' '); switch (comenda[0]) { case "Blokipam": { pam.ListaZajetychBlokow(); break; } case "Stronypam": { pam.StronyPamieci(); break; } case "Pamiecfiz": { pam.PamiecFizyczna(); break; } case "Pamiec": { Console.WriteLine(pam); break; } case "adduse": try { adduse(comenda[1], comenda[2], comenda[3]); } catch (System.IndexOutOfRangeException) { Console.WriteLine("niepoprawne dane"); } break; case "removeuse": int g = 1; try { g = removeuse(comenda[1]); } catch (System.IndexOutOfRangeException) { Console.WriteLine("niepoprawne dane"); } if (g == 0) { Console.WriteLine("nie istnieje taki uzytkownik"); } break; case "addgru": { dodajgru(comenda[1]); break; } case "removegru": string[] t = File.ReadAllLines(sciezka); int b = 0, c = t.Length; for (int i = 4; i < c; i = i + 3) { if (t[i] == comenda[1]) { b = 1; } } if (b == 0) { removegru(comenda[1]); } else { Console.WriteLine("usuń najpierw uzytkownikow nalezących do grupy"); } break; case "logout": stop = wylogowanie(); break; case "exit": bre = exit(); break; case "zmienkat": int a; a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1 || a == 0) { Console.WriteLine("nie istnieje taka nazwa"); } else { if (p.tabi[a].Typ == 'p') { Console.WriteLine("to nie jest katalog"); } else { aktualnykatalog = comenda[1]; } } break; case "creatk": iwezel.create(ref p, comenda[1], 'k', aktualnykatalog); break; case "creatp": iwezel.create(ref p, comenda[1], 'p', aktualnykatalog); iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); break; case "delete": iwezel.delete(ref p, comenda[1], ref o); break; case "open": { iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); if (slowo != null) { Console.WriteLine("\nOdczytano z pliku następujące dane: \n" + slowo); } break; } case "pisz": iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); break; case "pliki?": { Console.WriteLine(); Console.WriteLine("5. Tablica i-wezłów"); Console.WriteLine("6. Jakie bloki zajmuje plik"); Console.WriteLine("7. Który blok wyświetlić dla pliku"); Console.WriteLine("8. Wyświetlenie zawartości wszystkich katalogów"); Console.WriteLine("9. Jakie bloki na dysku są wolne, zajęte"); Console.WriteLine("10. Wyświetlenie całego dysku lub wybranego bloku"); Console.WriteLine(); break; } case "5": { Console.WriteLine("\nTablica i-węzłów"); iwezel.Wyswtabi(ref p); break; } case "6": { Console.WriteLine("6. Jakie bloki zajmuje plik"); Console.WriteLine("\nPodaj nazwę plku"); string nazwa; nazwa = Console.ReadLine(); iwezel.wyswzajblok(ref p, nazwa); break; } case "7": { Console.WriteLine("7. Który blok wyświetlić dla pliku"); int v = 0; Console.WriteLine("\nPodaj nazwę plku"); string nazwa, nazwa2; nazwa = Console.ReadLine(); int numer = -1; Console.WriteLine("\nPodaj nr bloku, który chcesz wyświetlić"); do { if (v > 0) { Console.WriteLine("\nPodaj nr bloku jeszcze raz"); } try { nazwa2 = Console.ReadLine(); numer = Int32.Parse(nazwa2); } catch (FormatException ex) { Console.WriteLine("Podaj liczbę!"); } v++; } while (numer < 0 || numer > 6); blok.Wyswietblok(ref p, numer, nazwa); break; } case "8": { Console.WriteLine("8. Wyświetlenie zawartości wszystkich katalogów"); WpisK.wyswk2(ref p); break; } case "9": { string nazwa; int v = 0; Console.WriteLine("9. Jakie bloki na dysku są wolne, zajęte"); Console.WriteLine("\nKtóre wyświetlić? Wolne(w) czy Zajęte(z)?"); do { if (v > 0) { Console.WriteLine("nie ma takiej akcji proszę podać jeszcze raz 'w' lub 'z'"); } nazwa = Console.ReadLine(); if (nazwa == "w" || nazwa == "W") { blok.wolnebloki(ref p, ref o); } if (nazwa == "z" || nazwa == "Z") { blok.zajetebloki(ref p, ref o); } v++; } while (nazwa != "w" && nazwa != "W" && nazwa != "z" && nazwa != "Z"); break; } case "10": { string nazwa, nazwa2; int v = 0, v1 = 0; int numer = -1; Console.WriteLine("10. Wyświetlenie całego dysku lub wybranego bloku"); Console.WriteLine("\nCo wyświetlić? Blok(b) czy Dysk(d)?"); do { if (v > 0) { Console.WriteLine("nie ma takiej akcji proszę podać jeszcze raz 'b' lub 'd'"); } nazwa = Console.ReadLine(); if (nazwa == "b" || nazwa == "B") { Console.WriteLine("Proszę podać nr bloku"); do { if (v1 > 0) { Console.WriteLine("Nie ma takiego bloku. Podaj jeszcze raz"); } try { nazwa2 = Console.ReadLine(); numer = Int32.Parse(nazwa2); } catch (FormatException ex) { Console.WriteLine("Podaj liczbę!"); } if (numer >= 0 && numer < 64) { blok.Wyswietbloklubdysk(ref p, numer, nazwa); } v1++; } while (numer < 0 || numer > 63); } if (nazwa == "d" || nazwa == "D") { blok.Wyswietbloklubdysk(ref p, 0, nazwa); } v++; } while (nazwa != "d" && nazwa != "D" && nazwa != "b" && nazwa != "B"); break; } case "proces": { Console.WriteLine("podaj PPID, PID i priorytet"); int ax1, bx1, cx1; ax1 = int.Parse(Console.ReadLine()); bx1 = int.Parse(Console.ReadLine()); cx1 = int.Parse(Console.ReadLine()); proces ppp = zarzadcapr.utwProDziecko(ax1, bx1, cx1); Console.WriteLine("Proces dodano"); zarzadcapr.exec(ppp); Console.WriteLine("Podaj ile bloków powinien posiadac proces"); //wczytane = Console.ReadLine(); po 3 bloki na proces ppp.heapAddrStart = pam.Zaalokuj(3); // statycznie ustawiony na 3 iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); //byte[] tabrozk; string[] str = slowo.Split(' '); // stringa zarzutowac na uinta a uinta na bajty // integer byte[] ttmp = new byte[4]; int y = 0; for (int l = 0; l < str.Length; l++) { uint tmp = Convert.ToUInt32(str[l]); ttmp = BitConverter.GetBytes(tmp); uint tmppp = BitConverter.ToUInt32(ttmp, 0); for (int x = 0; x < ttmp.Length; x++) { pam.Zapisz(ppp.heapAddrStart + y, ttmp[x]); y++; } } ile++; ////////////////////////////////////////////////////////////////////////////////////////// Console.WriteLine(pam); break; } case "procesor": { //////////////////////////////////////////////////////////////////////////////////////////////// Symulacja_procesora proc = new Symulacja_procesora(1, 4, 15); Interpreter it = new Interpreter(); proc.main.dodajnowy(zarzadcapr.kolejka.wyslijproces()); //-> dodaje 1 proces na starcie systemu [wklejam funkcje od Tadka] Console.WriteLine("\nStart Symulacji procesora!"); proc.main.info(); proces tmpp = proc.main.znajdz_zwroc_usun(); byte[] tabpam = new byte[4]; int z = 0; while (true) { for (int i = 0; i < 4; i++) { tabpam[i] = pam.Odczytaj(tmpp.heapAddrStart + i + (tmpp.l_rozk * 4)); } uint tmpppp = BitConverter.ToUInt32(tabpam, 0); // test -> jaki rozkaz proc.blokada = it.wykonajInstrukcje(tmpp, tabpam); // -> wynonanie 1 instrukcji z podanego procesu [wklejam funkcje od Iwony] proc.main.wypiszStanRejestruProcesu(tmpp); Console.In.Read(); Console.In.Read(); if (proc.blokada) // zakonczenie procesu { pam.Zwolnij(tmpp.heapAddrStart); tmpp = proc.main.znajdz_zwroc_usun(); pam.ListaZajetychBlokow(); proc.blokada = false; } if (tmpp == null) // koniec wykonywania wszystkich procesow { Console.Out.WriteLine("Ilosc taktow procesora: " + proc.takt); Console.Out.WriteLine("Wszystkie procesy zostaly wykonane!"); break; } if (proc.takt % proc.rekalk == 0 && tmpp != null) // obliczenie priorytetu dla wszystkich procesow po 15 cyklach { proc.main.zmniejsziprzestaw(); // oblicza prio dla pozostalych procesow tmpp.priorytet[2] = tmpp.priorytet[2] / 2; // oblicza prio dla 1 przetrymywanego w tmpp procesu tmpp.priorytet[0] = tmpp.priorytet[1] + tmpp.priorytet[2]; // } if (tmpp.l_rozk % proc.wywlaszcz == 0 && tmpp != null) // wywlaszczenie pocesu po 4 cyklach proca //EDIT { proc.main.przestaw(tmpp); proc.main.info(); tmpp = proc.main.znajdz_zwroc_usun(); } if (proc.takt % 1 == 0) // przychodzi proces { proces pr = zarzadcapr.kolejka.wyslijproces(); proces np = null; if (pr != null) { np = proc.main.dodajnowy(pr); // -> dodaje kolejne procesy do wykonania [funkcja od Tadka] Console.WriteLine("Dodano nowy proces do kolejki priorytetowej!\n"); } if (proc.main.coswpadlo == true) { if (np.priorytet[0] < tmpp.priorytet[0]) { proc.main.przestaw(tmpp); proc.main.info(); tmpp = proc.main.znajdz_zwroc_usun(); } else { } proc.main.coswpadlo = false; } } proc.takt++; } ile = 0; break; } case "wy": { zarzadcapr.wypisz2(); break; } case "wy2": { zarzadcapr.kolejka.wypiszkolejki(); break; } case "kill": { Console.WriteLine("podaj PID"); int axc = int.Parse(Console.ReadLine()); proces kkk = zarzadcapr.znajdz(axc); pam.Zwolnij(kkk.heapAddrStart); zarzadcapr.usun_z_k(axc); ile--; break; } //////////////////////////////////////////////////////////////////// KOMUNIKACJA /////////////////////////////////////////////////////////// case "com": Console.WriteLine("Wybierz rodzaj Łącza "); Console.WriteLine("N -> Utwórz Łącze Nazwane "); Console.WriteLine("R -> Usuń Łącze Nazwane "); Console.WriteLine("1 -> Komunikacja Nazwana "); Console.WriteLine("2 -> Komunikacja Nienazwana "); Console.WriteLine("3 -> Wypisz Dostepne Lacza "); string s1 = Console.ReadLine(); if (s1 == "1") { Console.WriteLine("PID procesu przekazującego wartość"); string s2 = Console.ReadLine(); try { if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s2))) { Console.WriteLine("PID procesu przyjmującego wartość"); string s3 = Console.ReadLine(); Console.WriteLine("Napisz komunikat"); string kom = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s3))) { ServiceLocator.GetService <Lacza>().CommunicationNamed(zarzadcapr.kolejka.k_wszystkich.First(z => z.PID == Convert.ToInt32(s2)), zarzadcapr.kolejka.k_wszystkich.First(z => z.PID == Convert.ToInt32(s3)), kom); } else { Console.WriteLine("Nie ma procesu o takim PID "); } } else { Console.WriteLine("Nie ma procesu o takim PID "); } } catch { } } else if (s1 == "2") { try { Console.WriteLine("Podaj PID procesu nadawcy"); string s2 = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s2))) { Console.WriteLine("Podaj PID procesu odbiorcy"); string s3 = Console.ReadLine(); Console.WriteLine("Przysyłany komunikat"); string skom = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s3))) { // Sprawdź pokrewieństwo int wysylacz = Convert.ToInt32(s2); int odbieracz = Convert.ToInt32(s3); var pro = zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == wysylacz); if (pro.potomkowie.Exists(z => z.PID == odbieracz) == true) { var pro1 = zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == odbieracz); pro1.rozkazy.Add(skom); Console.WriteLine("Komunikat został przekazany"); } else { Console.WriteLine("Procesy nie są spokrewnione"); } } else { Console.WriteLine("Nie ma procesu o takim PID. Czy chcesz utworzyć dziecko procesu o PID: " + s2 + " i przesłać komunikat ? (Y/N)"); string dec = Console.ReadLine(); if (dec == "Y" || dec == "y") { int rodzic = Convert.ToInt32(s2); int dziecko = zarzadcapr.kolejka.k_wszystkich.Max(z => z.PID) + 1; zarzadcapr.utwProDziecko(rodzic, dziecko, 20); var pro = zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == dziecko); pro.rozkazy.Add(skom); Console.WriteLine("Komunikat został przekazany dla potomka."); } else if (dec == "N" || dec == "n") { } else { Console.WriteLine("Zły rozkaz"); } } } else { Console.WriteLine("Nie ma procesu o takim PID "); } } catch { } break; } else if (s1 == "n" || s1 == "N") { Console.WriteLine("Podaj PID procesu nadawcy"); string s2 = Console.ReadLine(); try { if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s2))) { Console.WriteLine("Podaj PID procesu odbiorcy"); string s3 = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s3))) { ServiceLocator.GetService <Lacza>().UtworzLacze(zarzadcapr.kolejka.k_wszystkich.First(z => z.PID == Convert.ToInt32(s2)), zarzadcapr.kolejka.k_wszystkich.First(z => z.PID == Convert.ToInt32(s3))); Console.WriteLine("Utworzono Lacze"); } else { Console.WriteLine("Nie ma procesu o takim PID "); } } else { Console.WriteLine("Nie ma procesu o takim PID "); } } catch { } } else if (s1 == "r" || s1 == "R") { Console.WriteLine("Podaj nazwe lacza postaci 1-2"); string nazwa = Console.ReadLine(); ServiceLocator.GetService <Lacza>().UsunLacze(nazwa); } else if (s1 == "3") { Console.WriteLine("\n Utworzone Łącza: \n"); for (int i = 0; i < ServiceLocator.GetService <Lacza>().ListaLaczy.Count; i++) { Console.Write(ServiceLocator.GetService <Lacza>().ListaLaczy[i] + " "); } Console.WriteLine(""); } break; case "usunrozkaz": try { Console.WriteLine("Podaj PID procesu"); string s = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s))) { Console.WriteLine("Podaj rozkaz"); string s2 = Console.ReadLine(); var proc = zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == Convert.ToInt32(s)); if (proc.rozkazy.Contains(s2)) { ServiceLocator.GetService <Lacza>().ClearOrder(zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == Convert.ToInt32(s)), s2); Console.WriteLine("Usunięto"); } else { Console.WriteLine("Proces nie posiada takiego rozkazu"); } } else { Console.WriteLine("Nie ma procesu o takim PID "); } } catch { } break; case "przekaz": { try { Console.WriteLine("Podaj PID procesu, z którego pobrany ma zostać rozkaz."); string s = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s))) { Console.WriteLine("Podaj PID procesu, do którego przekazany ma zostać rozkaz."); string s4 = Console.ReadLine(); if (zarzadcapr.kolejka.k_wszystkich.Exists(z => z.PID == Convert.ToInt32(s4))) { Console.WriteLine("Podaj numer rozkazu."); string numer = Console.ReadLine(); ServiceLocator.GetService <Lacza>().przekazrozkaz(zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == Convert.ToInt32(s)), zarzadcapr.kolejka.k_wszystkich.Find(z => z.PID == Convert.ToInt32(s4)), Convert.ToInt32(numer)); } else { Console.WriteLine("Nie ma procesu o takim PID"); } } else { Console.WriteLine("Nie ma procesu o takim PID lub nie istnieję łącze nazwane lub pokrewieństwo pomiędzy procesami"); } } catch { } } break; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// default: { Console.WriteLine("niepoprawna komenda"); break; } } if (stop == 10) { return(0); } if (bre == 10) { return(1); } } }
public static int create(ref pom x, string nazwa, char typ, string nazwfold) //funkcja służąca do utworzenia pliku o typie: "typ", o nazwie: "nazwa" w katalogu o nazwie: "nazwfold" { if (licz == 20) { Console.WriteLine("\nWięcej plików nie dodamy, ponieważ tablica i-węzłów może mieć maksymalnie 20 elementów "); return(-1); } if (licz > 1) { int w, k; w = iwezel.czyistnieje(ref x, nazwa); k = iwezel.czyistnieje(ref x, nazwfold); if (w != -1) { Console.WriteLine("Taka nazwa już istnieje"); return(-1); } //sprawdzamy czy istnieje plik lub katalog o tej samej nazwie if (k == -1) { Console.WriteLine("Nie ma takiego katalogu plik lub katalog nie zostanie utworzony"); return(-1); } } if (typ == 'k') { iwezel z = new iwezel(ref x, typ); WpisK q = new WpisK(nazwa, (byte)licz); if (licz >= 2) { Console.WriteLine("Utworzono katalog: " + nazwa + " w katalogu: " + nazwfold); } for (int i = 0; i < x.LK.Count(); i++) { if (x.LK[i][0].nazwa == nazwfold) { x.LK[i].Add(q); break; } } x.LK.Add(new List <WpisK>()); x.LK[x.LK.Count() - 1].Add(q); if (licz == 1) { Console.WriteLine("Utworzono katalog 'Root' oraz 'Home' \n"); } } if (typ == 'p') { bool ok = false; iwezel z = new iwezel(ref x, typ); WpisK q = new WpisK(nazwa, (byte)licz); for (int i = 0; i < x.LK.Count(); i++) { for (int j = 0; j < x.LK[i].Count(); j++) { if (x.LK[i][j].nazwa == nazwa) { ok = true; } } //spr czy nie ma pliku o tej samej nazwie } if (ok == true) { Console.WriteLine("istnieje plik o takiej nazwie w tym katalogu!"); return(-1); } Console.WriteLine("Utworzono plik: " + nazwa + " w katalogu: " + nazwfold); for (int i = 0; i < x.LK.Count(); i++) { if (x.LK[i][0].nazwa == nazwfold && ok == false) { x.LK[i].Add(q); break; } } } licz++; return(0); }
//funkcja służąca do utworzenia pliku o typie: "typ", o nazwie: "nazwa" w katalogu o nazwie: "nazwfold" public static int create(ref pom x, string nazwa, char typ, string nazwfold) { if (licz == 20) { Console.WriteLine("\nWięcej plików nie dodamy, ponieważ tablica i-węzłów może mieć maksymalnie 20 elementów "); return -1; } if (licz > 1) { int w,k; w = iwezel.czyistnieje(ref x, nazwa); k = iwezel.czyistnieje(ref x, nazwfold); if (w != -1) { Console.WriteLine("Taka nazwa już istnieje"); return -1; } //sprawdzamy czy istnieje plik lub katalog o tej samej nazwie if (k == -1) { Console.WriteLine("Nie ma takiego katalogu plik lub katalog nie zostanie utworzony"); return -1; } } if (typ == 'k') { iwezel z = new iwezel(ref x, typ); WpisK q = new WpisK(nazwa, (byte)licz); if(licz>=2) Console.WriteLine("Utworzono katalog: "+nazwa+" w katalogu: "+ nazwfold); for (int i = 0; i < x.LK.Count(); i++) { if (x.LK[i][0].nazwa == nazwfold) { x.LK[i].Add(q); break; } } x.LK.Add(new List<WpisK>()); x.LK[x.LK.Count() - 1].Add(q); if (licz == 1) Console.WriteLine("Utworzono katalog 'Root' oraz 'Home' \n"); } if (typ == 'p') { bool ok = false; iwezel z = new iwezel(ref x, typ); WpisK q = new WpisK(nazwa, (byte)licz); for (int i = 0; i < x.LK.Count(); i++) { for (int j = 0; j < x.LK[i].Count(); j++) { if (x.LK[i][j].nazwa == nazwa) ok = true; } //spr czy nie ma pliku o tej samej nazwie } if (ok == true) { Console.WriteLine("istnieje plik o takiej nazwie w tym katalogu!"); return -1; } Console.WriteLine("Utworzono plik: " + nazwa + " w katalogu: " + nazwfold); for (int i = 0; i < x.LK.Count(); i++) { if (x.LK[i][0].nazwa == nazwfold && ok == false) { x.LK[i].Add(q); break; } } } licz++; return 0; }
public static int open(ref pom x, string naz, flaga l, ref int o, ref string Out) // o- ilość zajętych bloków na dysku //Out-zmienna potrzebna do zapisu odczytanego pliku l-flaga decyduje czy chcemy coś odczytać czy coś zapisać //funkcja służąca do odczytu lub zapisu { bool ok = false; string odkod = null; Out = odkod; int v = 0, b = 0; List <int> LBP = new List <int>(); for (int i = 0; i < x.LK.Count(); i++) { for (int j = 0; j < x.LK[i].Count(); j++) { if (x.LK[i][j].nazwa == naz) // znajdowanie pliku o nazwie zapisanej w parametrze 'naz' { v = x.LK[i][j].nriwezla; b = x.LK[i][0].nriwezla; ok = true; break; } } } if (ok == false) { Console.WriteLine("Nie ma takiego pliku"); return(-1); } LBP = iwezel.listazblok(ref x, v); if (l == flaga.ronly && ok == true) //funkcja odczytuje plik { if (x.tabi[v].Typ == 'p' && ((x.tabi[v].prawa1 == 1) || (x.tabi[v].prawa1 == 3) || (x.tabi[v].prawa1 == 7) || (x.tabi[v].prawa1 == 5))) { if (x.tabi[v].pierwszyblok == -1) { // domyślnie pierwszy blok ma -1 co oznacza ze plik jest pusty Console.WriteLine("Plik jest pusty"); return(-1); } else { byte[] q = new byte[LBP.Count * 32]; int ileb = LBP.Count; int nowa = 0; int r = 0; int[] taby = new int[ileb]; for (int i = 0; i < ileb; i++) { taby[i] = LBP[i]; } while (nowa != ileb) { if (nowa > 5) { Console.WriteLine("Plik może mieć maksymalnie 6 bloków!"); break; } for (int i = 0; i < 32; i++) { if (x.dysk[taby[nowa]].bl[i] == 0) { break; } q[r] = x.dysk[taby[nowa]].bl[i]; r++; } if (ileb - 1 == nowa) { odkod = Encoding.ASCII.GetString(q, 0, r); } nowa++; } Out = odkod; } } if (x.tabi[v].Typ == 'k') { WpisK.wyswk1(naz, ref x); //open z flaga ronly dla katalogu wyswietla wpisy danego katalogu } } if (l == flaga.wonly && ok == true) { //sprawdzamy czy jest to plik o odpowiednich prawach do ktorego mozemy cos zapisac if (x.tabi[v].Typ == 'p' && ((x.tabi[v].prawa1 == 2) || (x.tabi[v].prawa1 == 3) || (x.tabi[v].prawa1 == 7) || (x.tabi[v].prawa1 == 6))) { Console.WriteLine("Pisz do pliku o nazwie: " + naz); string dane; dane = Console.ReadLine(); byte[] q; q = Encoding.ASCII.GetBytes(dane); int ileb = q.Length / 32; int u = x.tabi[v].blokindeksowy; int r = 0; int nowa = 0, koncz = 0; if (x.tabi[v].pierwszyblok == -1) //jeśli plik jest pusty to zapis przebiega tak { if (q.Length % 32 == 0) { int[] taby = new int[ileb]; while (nowa != ileb) { if (koncz == 1 && r == 192) { Console.WriteLine("Plik może mieć maksymalnie 6 bloków!"); break; } if (koncz == 1) { break; } taby[nowa] = iwezel.wolnemiejsce(ref o, ref x); for (int i = 0; i < 32; i++) { if (r == q.Length || r == 192) { koncz = 1; break; } x.dysk[taby[nowa]].bl[i] = q[r]; r++; } if (nowa == 0) { x.tabi[v].pierwszyblok = taby[nowa]; } if (nowa == 1) { x.tabi[v].drugiblok = taby[nowa]; x.dysk[taby[nowa - 1]].nast = taby[nowa]; } if (nowa == 2) { u = iwezel.wolnemiejsce(ref o, ref x); x.dysk[taby[nowa - 1]].nast = u; x.tabi[v].blokindeksowy = u; for (int i = 0; i < 32; i++) { x.dysk[u].bl[i] = 65; //wypelnienie bloku indeksowego liczbą(indeksem) nie nazlezącą do dysku } //potrzebne do odczytania z bloku indeksowego kolejnych zajmowanych bloków x.dysk[u].bl[0] = (byte)taby[nowa]; } if (nowa == 3) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[1] = (byte)taby[nowa]; } if (nowa == 4) { //x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[2] = (byte)taby[nowa]; } if (nowa == 5) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[3] = (byte)taby[nowa]; } nowa++; if (r == 192) { koncz = 1; } } } if (q.Length % 32 != 0) { int[] taby2 = new int[ileb + 1]; while (nowa != ileb + 1) { if (koncz == 1 && r == 192) { Console.WriteLine("Plik może mieć maksymalnie 6 bloków!"); break; } if (koncz == 1) { break; } taby2[nowa] = iwezel.wolnemiejsce(ref o, ref x); for (int i = 0; i < 32; i++) { if (r == q.Length || r == 192) { koncz = 1; break; } x.dysk[taby2[nowa]].bl[i] = q[r]; r++; } if (nowa == 0) { x.tabi[v].pierwszyblok = taby2[nowa]; } if (nowa == 1) //2 bloki danych { x.tabi[v].drugiblok = taby2[nowa]; x.dysk[taby2[nowa - 1]].nast = taby2[nowa]; } if (nowa == 2) { u = iwezel.wolnemiejsce(ref o, ref x); x.dysk[taby2[nowa - 1]].nast = u; x.tabi[v].blokindeksowy = u; for (int i = 0; i < 32; i++) { x.dysk[u].bl[i] = 65; } x.dysk[u].bl[0] = (byte)taby2[nowa]; } if (nowa == 3) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[1] = (byte)taby2[nowa]; } if (nowa == 4) { //x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[2] = (byte)taby2[nowa]; } if (nowa == 5) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[3] = (byte)taby2[nowa]; } if (r == 192) { koncz = 1; } nowa++; } } x.tabi[v].rozmiar = r; x.tabi[b].rozmiar += x.tabi[v].rozmiar; } if (x.tabi[v].pierwszyblok != -1 && r == 0) //jeśli chcemy coś dopisać do pliku { byte[] q2 = null; int ostbl = 0; int poj = (LBP.Count - 1) * 32; ostbl = LBP.Last(); nowa = LBP.Count; q2 = x.dysk[ostbl].bl; for (int i = 0; i < 32; i++) { if (q2[i] != 0) { poj++; } if (q2[i] == 0) { x.dysk[ostbl].bl[i] = q[r]; r++; poj++; if (r == q.Length || poj == 192) { break; } } } if (q.Length - r <= 0) { goto skok; } ileb = ((q.Length - r) / 32); if (q.Length - r % 32 == 0) { int m = 0; int[] taby = new int[ileb]; while (nowa != ileb + nowa) { if (poj == 192) { koncz = 1; } if (koncz == 1 && poj == 192) { Console.WriteLine("Plik może mieć maksymalnie 6 bloków!"); break; } if (koncz == 1) { break; } taby[m] = iwezel.wolnemiejsce(ref o, ref x); for (int i = 0; i < 32; i++) { if (r == q.Length || poj == 192) { koncz = 1; break; } x.dysk[taby[m]].bl[i] = q[r]; r++; poj++; } if (nowa == 0) { x.tabi[v].pierwszyblok = taby[m]; } if (nowa == 1) { x.tabi[v].drugiblok = taby[m]; x.dysk[LBP.First()].nast = taby[m]; } if (nowa == 2) { u = iwezel.wolnemiejsce(ref o, ref x); x.dysk[taby[m - 1]].nast = u; x.tabi[v].blokindeksowy = u; for (int i = 0; i < 32; i++) { x.dysk[u].bl[i] = 65; //wypelnienie bloku indeksowego liczbą(indeksem) nie nazlezącą do dysku } //potrzebne do odczytania z bloku indeksowego kolejnych zajmowanych bloków x.dysk[u].bl[0] = (byte)taby[m]; } if (nowa == 3) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[1] = (byte)taby[m]; } if (nowa == 4) { //x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[2] = (byte)taby[m]; } if (nowa == 5) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[3] = (byte)taby[m]; } m++; nowa++; } } if (q.Length - r % 32 != 0) { int m = 0; int[] taby2 = new int[ileb + 1]; while (nowa != ileb + 1 + nowa) { if (poj == 192) { koncz = 1; } if (koncz == 1 && poj == 192) { Console.WriteLine("Plik może mieć maksymalnie 6 bloków!"); break; } if (koncz == 1) { break; } taby2[m] = iwezel.wolnemiejsce(ref o, ref x); for (int i = 0; i < 32; i++) { if (r == q.Length || poj == 192) { koncz = 1; break; } x.dysk[taby2[m]].bl[i] = q[r]; r++; poj++; } if (nowa == 0) { x.tabi[v].pierwszyblok = taby2[m]; } if (nowa == 1) //2 bloki danych { x.tabi[v].drugiblok = taby2[m]; x.dysk[LBP.First()].nast = taby2[m]; } if (nowa == 2) { u = iwezel.wolnemiejsce(ref o, ref x); x.dysk[taby2[m - 1]].nast = u; x.tabi[v].blokindeksowy = u; for (int i = 0; i < 32; i++) { x.dysk[u].bl[i] = 65; } x.dysk[u].bl[0] = (byte)taby2[m]; } if (nowa == 3) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[1] = (byte)taby2[m]; } if (nowa == 4) { //x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[2] = (byte)taby2[m]; } if (nowa == 5) { // x.dysk[taby[nowa - 1]].nast = taby[nowa]; x.dysk[u].bl[3] = (byte)taby2[m]; } m++; nowa++; } } skok: x.tabi[b].rozmiar += r; x.tabi[v].rozmiar = x.tabi[v].rozmiar + r; } //kon dopis } } return(0); }
public int polecenia() { int stop = 0, bre = 0; while (true) { Console.Write("Komenda:"); string com; com = Console.ReadLine(); string[] comenda = com.Split(' '); switch (comenda[0]) { case "logout": stop = wylogowanie(); break; case "zmhaslo": string[] t = File.ReadAllLines(sciezka); int c = t.Length; for (int i = 2; i < c - 2; i = i + 3) { if (t[i] == login) { t[i + 1] = comenda[1]; } } System.IO.File.WriteAllLines(sciezka, t); break; case "zmienkat": int a; a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1 || a == 0) { Console.WriteLine("nie istnieje taka nazwa"); } else { if (p.tabi[a].Typ == 'p') { Console.WriteLine("to nie jest katalog"); } else { if (p.tabi[a].IDuzytkownika == login) { aktualnykatalog = comenda[1]; } else if (p.tabi[a].IDgrupy == gru) { if (p.tabi[a].prawa2 != 0) { aktualnykatalog = comenda[1]; } else if (p.tabi[a].prawa3 != 0) { aktualnykatalog = comenda[1]; } else { Console.WriteLine("nie masz zadnych praw w tym katalogu"); } } } } break; case "open": { int ff = 1; a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1 || a == 0) { Console.WriteLine("nie istnieje taka nazwa"); } else if (p.tabi[a].IDuzytkownika == login) { iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); ff = 0; } if (a != -1 && a != 0) { if (p.tabi[a].IDgrupy == gru && ff == 1) { if (p.tabi[a].prawa2 != 0) { iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); ff = 0; } } } if (a != -1 && a != 0) { if (p.tabi[a].prawa3 != 0 && ff == 1) { iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); ff = 0; } } if (ff == 1) { Console.WriteLine("nie masz zadnych praw w tym pliku"); } if (ff == 0 && slowo != null) { Console.WriteLine(slowo); } } break; case "pisz": { int ff = 1; a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1 || a == 0) { Console.WriteLine("nie istnieje taka nazwa"); } else if (p.tabi[a].IDuzytkownika == login) { iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); ff = 0; } if (a != -1 && a != 0) { if (p.tabi[a].IDgrupy == gru && ff == 1) { if (p.tabi[a].prawa2 == 2 || p.tabi[a].prawa2 == 3 || p.tabi[a].prawa2 == 6 || p.tabi[a].prawa2 == 7) { iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); ff = 0; } } } if (a != -1 && a != 0) { if (p.tabi[a].prawa3 == 2 || p.tabi[a].prawa3 == 3 || p.tabi[a].prawa3 == 6 || p.tabi[a].prawa3 == 7) { iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); ff = 0; } } if (ff == 1) { Console.WriteLine("nie mozesz dopisywać"); } break; } case "exit": bre = exit(); break; case "creatk": iwezel.create(ref p, comenda[1], 'k', aktualnykatalog); a = iwezel.czyistnieje(ref p, comenda[1]); p.tabi[a].IDuzytkownika = login; p.tabi[a].IDgrupy = gru; break; case "creatp": iwezel.create(ref p, comenda[1], 'p', aktualnykatalog); iwezel.open(ref p, comenda[1], flaga.wonly, ref o, ref slowo); a = iwezel.czyistnieje(ref p, comenda[1]); p.tabi[a].IDuzytkownika = login; p.tabi[a].IDgrupy = gru; break; case "delete": a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1) { Console.WriteLine("nie istnieje taki plik"); } else if (p.tabi[a].IDuzytkownika == login) { iwezel.delete(ref p, comenda[1], ref o); } else { Console.WriteLine("Nie mozesz tego usunac"); } break; case "zmprawa": try { uint b = Convert.ToUInt32(comenda[2]); uint d = Convert.ToUInt32(comenda[3]); uint e = Convert.ToUInt32(comenda[3]); byte f = Convert.ToByte(b); byte g = Convert.ToByte(d); byte h = Convert.ToByte(f); if (f > 7 || g > 7 || h > 7) { Console.WriteLine("niepoprawna wartosc praw"); } a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1) { Console.WriteLine("nie istnieje taki plik"); } else if (p.tabi[a].IDuzytkownika == login) { iwezel.chacces(ref p, comenda[1], f, g, h); } } catch (System.IndexOutOfRangeException) { Console.WriteLine("niepoprawne dane"); } break; case "Blokipam": { pam.ListaZajetychBlokow(); break; } case "Stronypam": { pam.StronyPamieci(); break; } case "Pamiecfiz": { pam.PamiecFizyczna(); break; } case "Pamiec": { Console.WriteLine(pam); break; } case "pliki?": { Console.WriteLine(); Console.WriteLine("5. Tablica i-wezłów"); Console.WriteLine("6. Jakie bloki zajmuje plik"); Console.WriteLine("7. Który blok wyświetlić dla pliku"); Console.WriteLine("8. Wyświetlenie zawartości wszystkich katalogów"); Console.WriteLine("9. Jakie bloki na dysku są wolne, zajęte"); Console.WriteLine("10. Wyświetlenie całego dysku lub wybranego bloku"); Console.WriteLine(); break; } case "5": { Console.WriteLine("\nTablica i-węzłów"); iwezel.Wyswtabi(ref p); break; } case "6": { Console.WriteLine("6. Jakie bloki zajmuje plik"); Console.WriteLine("\nPodaj nazwę plku"); string nazwa; nazwa = Console.ReadLine(); iwezel.wyswzajblok(ref p, nazwa); break; } case "7": { Console.WriteLine("7. Który blok wyświetlić dla pliku"); int v = 0; Console.WriteLine("\nPodaj nazwę plku"); string nazwa, nazwa2; nazwa = Console.ReadLine(); int numer = -1; Console.WriteLine("\nPodaj nr bloku, który chcesz wyświetlić"); do { if (v > 0) { Console.WriteLine("\nPodaj nr bloku jeszcze raz"); } try { nazwa2 = Console.ReadLine(); numer = Int32.Parse(nazwa2); } catch (FormatException ex) { Console.WriteLine("Podaj liczbę!"); } v++; } while (numer < 0 || numer > 6); blok.Wyswietblok(ref p, numer, nazwa); break; } case "8": { Console.WriteLine("8. Wyświetlenie zawartości wszystkich katalogów"); WpisK.wyswk2(ref p); break; } case "9": { string nazwa; int v = 0; Console.WriteLine("9. Jakie bloki na dysku są wolne, zajęte"); Console.WriteLine("\nKtóre wyświetlić? Wolne(w) czy Zajęte(z)?"); do { if (v > 0) { Console.WriteLine("nie ma takiej akcji proszę podać jeszcze raz 'w' lub 'z'"); } nazwa = Console.ReadLine(); if (nazwa == "w" || nazwa == "W") { blok.wolnebloki(ref p, ref o); } if (nazwa == "z" || nazwa == "Z") { blok.zajetebloki(ref p, ref o); } v++; } while (nazwa != "w" && nazwa != "W" && nazwa != "z" && nazwa != "Z"); break; } case "10": { string nazwa, nazwa2; int v = 0, v1 = 0; int numer = -1; Console.WriteLine("10. Wyświetlenie całego dysku lub wybranego bloku"); Console.WriteLine("\nCo wyświetlić? Blok(b) czy Dysk(d)?"); do { if (v > 0) { Console.WriteLine("nie ma takiej akcji proszę podać jeszcze raz 'b' lub 'd'"); } nazwa = Console.ReadLine(); if (nazwa == "b" || nazwa == "B") { Console.WriteLine("Proszę podać nr bloku"); do { if (v1 > 0) { Console.WriteLine("Nie ma takiego bloku. Podaj jeszcze raz"); } try { nazwa2 = Console.ReadLine(); numer = Int32.Parse(nazwa2); } catch (FormatException ex) { Console.WriteLine("Podaj liczbę!"); } if (numer >= 0 && numer < 64) { blok.Wyswietbloklubdysk(ref p, numer, nazwa); } v1++; } while (numer < 0 || numer > 63); } if (nazwa == "d" || nazwa == "D") { blok.Wyswietbloklubdysk(ref p, 0, nazwa); } v++; } while (nazwa != "d" && nazwa != "D" && nazwa != "b" && nazwa != "B"); break; } case "procesor": { //////////////////////////////////////////////////////////////////////////////////////////////// Symulacja_procesora proc = new Symulacja_procesora(1, 4, 15); Interpreter it = new Interpreter(); proc.main.dodajnowy(zarzadcapr.kolejka.wyslijproces()); //-> dodaje 1 proces na starcie systemu [wklejam funkcje od Tadka] Console.WriteLine("\nStart Symulacji procesora!"); proc.main.info(); proces tmpp = proc.main.znajdz_zwroc_usun(); byte[] tabpam = new byte[4]; int z = 0; while (true) { for (int i = 0; i < 4; i++) { tabpam[i] = pam.Odczytaj(tmpp.heapAddrStart + i + (tmpp.l_rozk * 4)); } uint tmpppp = BitConverter.ToUInt32(tabpam, 0); // test -> jaki rozkaz proc.blokada = it.wykonajInstrukcje(tmpp, tabpam); // -> wynonanie 1 instrukcji z podanego procesu [wklejam funkcje od Iwony] proc.main.wypiszStanRejestruProcesu(tmpp); Console.In.Read(); Console.In.Read(); if (proc.blokada) // zakonczenie procesu { pam.Zwolnij(tmpp.heapAddrStart); tmpp = proc.main.znajdz_zwroc_usun(); pam.ListaZajetychBlokow(); proc.blokada = false; } if (tmpp == null) // koniec wykonywania wszystkich procesow { Console.Out.WriteLine("Ilosc taktow procesora: " + proc.takt); Console.Out.WriteLine("Wszystkie procesy zostaly wykonane!"); break; } if (proc.takt % proc.rekalk == 0 && tmpp != null) // obliczenie priorytetu dla wszystkich procesow po 15 cyklach { proc.main.zmniejsziprzestaw(); // oblicza prio dla pozostalych procesow tmpp.priorytet[2] = tmpp.priorytet[2] / 2; // oblicza prio dla 1 przetrymywanego w tmpp procesu tmpp.priorytet[0] = tmpp.priorytet[1] + tmpp.priorytet[2]; // } if (tmpp.l_rozk % proc.wywlaszcz == 0 && tmpp != null) // wywlaszczenie pocesu po 4 cyklach proca //EDIT { proc.main.przestaw(tmpp); proc.main.info(); tmpp = proc.main.znajdz_zwroc_usun(); } if (proc.takt % 1 == 0) // przychodzi proces { proces pr = zarzadcapr.kolejka.wyslijproces(); proces np = null; if (pr != null) { np = proc.main.dodajnowy(pr); // -> dodaje kolejne procesy do wykonania [funkcja od Tadka] } if (proc.main.coswpadlo == true) { if (np.priorytet[0] < tmpp.priorytet[0]) { proc.main.przestaw(tmpp); proc.main.info(); tmpp = proc.main.znajdz_zwroc_usun(); } else { } proc.main.coswpadlo = false; } } proc.takt++; } ile = 0; break; } case "proces": { int q = 0; a = iwezel.czyistnieje(ref p, comenda[1]); if (a == -1 || a == 0) { Console.WriteLine("nie istnieje taka nazwa"); } else if (p.tabi[a].IDuzytkownika == login) { q = 1; } if (a != -1 && a != 0) { if (p.tabi[a].IDgrupy == gru && q == 1) { if (p.tabi[a].prawa2 == 4 || p.tabi[a].prawa2 == 5 || p.tabi[a].prawa2 == 6 || p.tabi[a].prawa2 == 7) { q = 1; } } } if (a != -1 && a != 0) { if (p.tabi[a].prawa3 == 4 || p.tabi[a].prawa3 == 5 || p.tabi[a].prawa3 == 6 || p.tabi[a].prawa3 == 7) { q = 1; } } if (q == 0) { Console.WriteLine("nie mozesz tego zrobic"); } else { Console.WriteLine("podaj PPID, PID i priorytet"); int ax1, bx1, cx1; ax1 = int.Parse(Console.ReadLine()); bx1 = int.Parse(Console.ReadLine()); cx1 = int.Parse(Console.ReadLine()); proces ppp = zarzadcapr.utwProDziecko(ax1, bx1, cx1); Console.WriteLine("Proces dodano"); zarzadcapr.exec(ppp); Console.WriteLine("Podaj ile bloków powinien posiadac proces"); //wczytane = Console.ReadLine(); po 3 bloki na proces ppp.heapAddrStart = pam.Zaalokuj(3); // statycznie ustawiony na 3 iwezel.open(ref p, comenda[1], flaga.ronly, ref o, ref slowo); //byte[] tabrozk; string[] str = slowo.Split(' '); // stringa zarzutowac na uinta a uinta na bajty // integer byte[] ttmp = new byte[4]; int y = 0; for (int l = 0; l < str.Length; l++) { uint tmp = Convert.ToUInt32(str[l]); ttmp = BitConverter.GetBytes(tmp); uint tmppp = BitConverter.ToUInt32(ttmp, 0); for (int x = 0; x < ttmp.Length; x++) { pam.Zapisz(ppp.heapAddrStart + y, ttmp[x]); y++; } } ile++; ////////////////////////////////////////////////////////////////////////////////////////// Console.WriteLine(pam); } break; } case "wy": { zarzadcapr.wypisz2(); break; } case "wy2": { zarzadcapr.kolejka.wypiszkolejki(); break; } case "kill": { Console.WriteLine("podaj PID"); int axc = int.Parse(Console.ReadLine()); proces kkk = zarzadcapr.znajdz(axc); pam.Zwolnij(kkk.heapAddrStart); zarzadcapr.usun_z_k(axc); ile--; break; } default: { Console.WriteLine("niepoprawna komenda"); break; } } if (stop == 10) { return(0); } if (bre == 10) { return(1); } } }