Wywoływanie programu kilka razy, zachowanie jednego procesu (?)

0

Cze.

Jest to pytanie z serii nie do końca wiem o co pytam.

Mianowice uruchamiając program uruchamiamy nowy proces i tak możemy w kółko (oczywiście nie uwzględniając limitu pamięci).
Jednak chciałbym napisać program w taki sposób, żeby uruchamiając go po prostu szła do niego nowa porcja inputu, a proces był dalej ten sam.
Coś w stylu:

...
bool tasksCompleted = false;
...
while !tasksCompleted{
    input = waitForNewInputFromSystem();
    launch_new_thread(HandleInput, input);
}

Jeśli wiecie o co mi chodzi, to prosiłbym o naprostowanie mojego problemu i wskazanie czy coś takiego jest możliwe, oraz jak to osiągnąć.

Z góry dziękuję.
Pozdrawiam.

PS
chodzi o wywoływanie z konsoli z argumentami lub z skrótu

0

po prostu nasluchuj zmian (zdarzenia, plik, co tam chcesz)

program dziala caly czas w tle i powiedzmy co sekunde sprawdza czy jest cos nowego w folderze incoming jezeli jest to przetwarza, jezeli nie to nic nie robi. W obu przypadkach (po przetworzeniu lub nic nie robieniu) program czeka nadal sekunde

o to Ci chodzilo?

0

Nie, może sprecyzuję.

Wywołując program np. z konsoli lub klikając startuje nowy proces. I chciałbym, żeby przy ponownym uruchomieniu nie uruchomił się kolejny proces tego programu, tylko input został do niego przekazany (no w tym przypadku to miałoby to sens tylko w przypadku konsoli, lub skrótu).
Czyli:

>do_cool_stuff a b c - startuje jeden proces, do którego został przekazany input, on sobie coś tam robi
>do_cool_stuff x y z - dalej mamy jeden proces, został przekazany NOWY input. Nie jest tworzony nowy proces.
0

coś podobnego robiłam w programie windowsowym, przy uruchamianiu findwindow,ijak znalazł to przesyłał mu komunikat

1

Kluczowe hasło dla gógla - Inter Process Communication.
W skrócie Bracie @PrezesiQ swoją aplikację musisz napisać w oparciu o taki szkielet:

  • Uruchamiasz program, tworzy się jego proces, i pierwsze co robi to używając mechanizmów IPC sprawdza, czy już taki proces nie jest uruchomiony
  • Jak nie jest, to uruchomiony proces staje się powiedzmy Master Processem, i sobie działa dalej.
  • Kolejne uruchomienia programu wykrywają, że istnieje Master Process, zatem komunikują się z nim, dają mu dane czy co tam, po czym się zakańczają.

Aczkolwiek, mym zdaniem coś przekombinowujesz Bracie. Opisz bez zagłębiania się w technikalia, jaki efekt chcesz uzyskać, bo wygląda to na problem XY

0

co najmniej dziwny sposób komunikacji z programem i zapewnianie mu nowych danych.
tu masz coś o sprawdzaniu czy proces działa
https://stackoverflow.com/questions/800730/c-c-how-to-tell-if-a-program-is-already-running

Moim zdaniem masz jakiś dziwny pomysł.Weź obserwuj jakiś folder czy miej jakiś frontend i ślij do programu dane (JSON i POST, poprzez tworzenie nowego pliku w folderze) a dla każdego nowego taska twórz osobny wątek.

0

Piszę program zarządzający plikami tymczasowymi. Ogólnie jestem zafiksowany na pisaniu drobnych narzędzi, których brakuje wszędzie, lub nie wiem o ich istnieniu.
W tym przypadku program umożliwiałby:

  1. Oznaczanie plików jako tymczasowe na X czasu
  2. Tworzenie plików tymczasowych na X czasu
  3. Zarządzanie plikami tymczasowymi (stworzonymi i oznaczonymi) - odznaczanie, zmiana czasu, etc.

I żeby móc to zrobić, to najlepiej dla mnie byłoby mieć jeden proces który miałby jakąś strukturę danych przechowująca te pliki tymczasowe (tzn. inne struktury danych zawierające o nich dane m.in ścieżka czy expiration time) i nimi zarządzał.

0

To po co ci wiele procesów? Jeden programik ma w sobie zapisane te tymczasowe pliki, zapisuje je sobie lokalnie do pliczku i tyle. Zamkniesz program wiesz jaka była ostatnia struktura, otwierasz ponownie to wiesz co miałeś ostatnio. Jak chcesz wprowadzać nowe dane to robisz gui i tyle. W czym problem?

0

Właśnie nie potrzebuję wielu procesów, nie chcę też GUI, ponieważ pisanie z CLI jest szybsze niż szukanie przycisków w okienku i klikanie myszką.
Musiałby być jeden proces, ponieważ musiałby pilnować czasu (w osobnych wątkach dla każdego pliku, oczywiście byłyby limity, etc.).

Chyba, że nie do końca zrozumiałem Twój zamysł, to proszę naprostuj mi go.

0

Musiałby być jeden proces, ponieważ musiałby pilnować czasu

Zrób sobie menu w konsolce na głównym wątku. Lista plików to nic innego jak lista która jest posortowana czasami. I tu możesz na szybko mieć dwa podejścia:

  • co 1 s bierzesz pierwszy element z listy(czyli który jest najbliżej wygaśnięcia. Patrzysz czy przekroczył czas, jak tak to wykonujesz operację na pliku, usuwasz z listy i pobierasz kolejny element jak jeszcze zostało trochę czasu do usunięcia znowu idziesz spać na 1s
  • Bierzesz pierwszy plik z listy, patrzysz ile czasu potrzeba, i dopiero za tyle się wybudzisz.

To tak na szybko

0

A informacje na temat plików możesz trzymać w pliku sqlite, on ma obsługę dostępu z wielu procesów naraz więc można się przez niego przy okazji synchronizować

0

Czyli piszecie, żeby zrobić tak:

  1. Odpala się program, sprawdza, czy inny taki sam proces jest, jeśli nie to jest masterem, zapisuje sobie dane do sqlite, startuje wątek, który obsługuje plik i sprawdza co 1s plik sqlite
  2. Jeśli jest już taki proces, to tylko zapisuje do sqlite dane, które master sprawdzi

?

0

po prostu odpala program i tyle, zarządza tymi plikami o których wie. Robi sobie dodatkowe wątki do obsługi i tyle.

0

Przypoominam Bracie @PrezesiQ iż nadal nie odpowiedziałeś na pytanie o pożądany, końcowy efekt działania twojego programu oraz co ma na wejściu. Na 95% da się podejść do zagadnienia dużo prościej niż przez odpalanie kolejnych procesów z tej samej binarki.

0

Nie potrzebuję odpalać kolejnych procesów, tylko mieć jeden proces...
Działanie:
(nazwa jeszcze nie jest zdecydowana)
Kiedy zostaje z konsoli wywołane:

nazwa (relatywna lub nie) ścieżka-do-pliku czas

To ma startować nowy proces (jeśli żadnego nie ma ofc). W specjalnej strukturze danych zostają dodane informacje o pliku/folderze + czas po jakim ma zostać usunięty. Startuje wątek, który śpi sobie na czas (będzie to specjalny sen, który sprawdza co jakiś czas, czy czas się czasem nie zmienił i dostosowuje się do tego) i po tym czasie usuwa plik/folder.
Póki jest przynajmniej jeden plik, póty proces ma być.
Każde kolejne wywołanie nazwa musi mieć dostęp do tej struktury danych, która będzie w pamięci jednego procesu, ponieważ prawie każde wywołanie potrzebuje dostępu do tej struktury danych (oprócz help, config i braku argumentów):

nazwa ścieżka-do-pliku czas (jeśli czas nie jest podany, to ustawia na domyślny czas, który byłby w configu, lub jeśli plik znajduje się w strukturze, to go usuwa, a wątek zostaje zakończony)
nazwa new nazwa-pliku czas (tworzy plik tymczasowy i go oznacza na czas, który może być domyślny, jeśli nie jest podany)
nazwa list - lista plików
Póki co to wszystkie funkcjonalności, które przychodzą mi do głowy.

0

Okay, a zatem:

  • pisząc w konsoli nazwa_programu parametry no nie ma wuja, każde takie wywołanie komendy powoduje stworzenie nowego procesu.
  • więc będziesz potrzebował takiej architektury jak opisałem poprzednio.

Ten MasterProcess będzie miał za zadanie utworzyć i aktualizować wszystkie potrzebne struktury danych, a nowe procesy jak zobaczą, że MasterProcess istnieje mają przekazać mu dane.

0

No dokładnie. Dzięki

1

Miałem teraz na uczelni zajęcia z Programowania Równoległego i Rozproszonego, pisaliśmy w C++ w oparciu o Win32, OpenMP oraz MPI.
Ta ostatnia biblioteka - MPI fajnie umożliwia uruchamianie procesu typu master oraz jego workerów. Ma też zaimplementowane funkcje to rozdzielania danych na mniejsze porcje dla każdego procesu, wysyłanie broadcast dla wszystkich procesów tych samych danych itp itd. Generalnie na laborkach było trudno ale całkiem fajnie, być może Ci się to przyda.

Pozdrawiam

Edit:
Na youtubie jest pare azjatów, turków etc którzy jak zwykle przy tego typu niszowych tematach, świetnie Ci wytłumaczą o co chodzi :D

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