[#1] odpalanie programu spod programu...
Witam!

Jaką metodą uruchomić we własnym programie (pisanym w C) inny program? Dla przykładu, chcę zrobić proste GUI do programu uruchamianego spod konsoli. Do tego jestem tak wybredny, że chciałbym się komunikować z tym programem (np. aby po naciśnięciu klawisza STOP w GUI, wysyłana była do odpalonego programu komenda CTRL+C).

Jak ten temat ugryść najprościej i najbardziej elegancko ? Póki co odnalazłem w AutoDocach taką funkcję jak SystemTagList. Jak sądzicie - to dobry trop ? Nie chcę od razu pójść w las w tym temacie, dlatego pytam się asekuracyjnie na forum :)

Z góry dzięx za pomoc

[#2] Re: odpalanie programu spod programu...

@MarX, post #1

tak, i mozesz przekierowywac output do swojego programu, a control c to wyslanie sygnalu wiec tez wykonalne

[#3] Re: odpalanie programu spod programu...

@MarX, post #1

Tak, System() to chyba najlepsze rozwiązanie.

[#4] Re: odpalanie programu spod programu...

@rzookol, post #2

OK, użyłem SystemTagList i odpaliłem (narazie bez gui) jakiś program spod swojego własnego programu. Wszystko pięknie, ale w jaki sposób przekierować output generowany przez uruchomiony "podprogram" (który teraz leci na konsolę) do swojego programu ?

Pozdrawiam!

[#5] Re: odpalanie programu spod programu...

@MarX, post #4

OK, pomęczę was trochę jeszcze w tym temacie.

Pytanie: Jak zidentyfikować port na którym nasłuchuje odpalony (spod mojego programu), obcy program ? Chcę wysłać mu sygnał CTRL+C, ale najpierw muszę przecież znaleźć port na którym on nasłuchuje. W innym wypadku nie będę miał MsgPortu zwracanego przez FindPort i dupa blada

[#6] Re: odpalanie programu spod programu...

@MarX, post #5

Sygnały nie są wysyłane do procesów poprzez porty (porty są używane do wysyłania wiadomości). Jeżeli chcesz wysłać sygnał CTRL-C do procesu, wystarczy znać jego adres. Robi się to tak:

struct Task* obcy;

if (obcy = FindTask("Nazwa")) Signal(obcy, SIGBREAKF_CTRL_C);

Rozwiązanie to ma jedną wadę, mianowicie teoretycznie między znalezieniem procesu a wysłaniem sygnału proces może zniknąć i autodoc polega robienie całej operacji wewnątrz pary Forbid()/Permit(). Szczerze mówiąc sam nie wiem, prawdopodobieństwo zajścia takiej akcji jest znikomo małe, a Forbid()-owanie systemu bez potrzeby też nie jest dobrą sprawą.

[#7] Re: odpalanie programu spod programu...

@Grzegorz Kraszewski, post #6

taka mala uwaga na temat forbida. jezeli istnieje ryzyko wystapienia bledu i forbid takiemu ryzyku przeciwdziala to TRZEBA go uzywac, a nie liczyc na szczescie. tak wiec pare instrukcji FindTask i Signal nalezy zawrzec w pare Forbid()/Permit().

[#8] Re: odpalanie programu spod programu...

@Grzegorz Kraszewski, post #6

Sory za lameriadę, ale dopiero raczkuję w temacie "sygnałów" :)

Pytanie 1:

Dzięki Krashan za podpowiedź, ale jak sądzę to odnosi się do taska, którego nazwę już znam i mogę jawnie podać. Co jednak zrobić, albo inaczej - jak znaleźć nazwę taska, którego wywołuje mój program. Zauważyłem że po uruchomieniu programu mój task (rodzic) nazywa się np. CLI #3: Rodzic, a task uruchomiony przez rodzica to np. CLI #4: dh3:dzieci/Bachor. Wiem, że jeżeli rodzica odpalę jako aplikację "Workbenchową" to nie będę miał przedrostka CLI. Jednak program dziecko dalej będzie procesem CLI, którego dalej nie mogę "uchwycić".

Pytanie 2:

Mam taki kawałek kodu:
#include 
#include 

#include 
#include 
#include 

main()
{
struct Task *MojTask;
struct Process *MojProces;
struct CommandLineInterface *cli;

MojTask=FindTask(NULL);

 MojProces= (struct Process *)MojTask;
  cli = BADDR(MojProces->pr_CLI);

Dlaczego przy ostatniej linijce sypie mi: dereferencing pointer to incomplete type ?

Z góry dzięki za pomoc



Ostatnia modyfikacja: 27.01.2010 10:51:54
[#9] Re: odpalanie programu spod programu...

@MarX, post #8

Sypie Ci dlatego, że struktura Process zdefiniowana jest w .

A co do pierwszego problemu. Wszystko zależy od tego czym jest ten proces potomny. Jeżeli jest to coś, co napisałeś sam, to najlepiej uczynić go wątkiem Twojego programu, bez zabawy w System(). Jeżeli natomiast jest to z góry dany, zewnętrzny program, to sam nie wiem...

[#10] Re: odpalanie programu spod programu...

@Grzegorz Kraszewski, post #9

Pytanie może podobne, ale z innej strony. Czy metoda SystemTagList zwraca gdzieś adres do "odpalonego" przez siebie taska ?

[#11] Re: odpalanie programu spod programu...

@MarX, post #10

Nie zwraca, ponieważ ta funkcja nie uruchamia tego procesu, tylko tworzy nowy proces powłoki (shell) i każe mu odpalić dany program.

[#12] Re: odpalanie programu spod programu...

@Grzegorz Kraszewski, post #11

Dzięki za info

[#13] PIPE - jak zacząć ?

@MarX, post #1

Chciałbym przekierować komunikaty wypluwane przez "konsolowy" program uruchomiony spod mojego programu za pomocą SystemTagList. Z grubsza wygląda to tak:
char linia[128]; // tu ma wylądować linia odczytana z pipe`a
BPTR pipe_out;
BPTR pipe_in;
BPTR wyjscie;   

struct TagItem stags[4];

   stags[0].ti_Tag = SYS_Input;
   stags[0].ti_Data = NULL;
   stags[1].ti_Tag = SYS_Output;
   stags[1].ti_Data = wyjscie;
   stags[2].ti_Tag = SYS_Asynch;
   stags[2].ti_Data = TRUE;
   stags[3].ti_Tag = TAG_DONE;
   stags[3].ti_Data = 0;
   
// otwieram pipe do pakowania wynikow

pipe_out = Open("PIPE:moj_pipe", MODE_NEWFILE);

// otwieram pipe do odczytania wyplutych wczesniej wynikow

pipe_in = Open("PIPE:moj_pipe", MODE_OLDFILE);    
	
// odpalam jakis konsolowy program  

    SystemTagList("dh1:jakis_tam_program", stags)  
		
// odczytuje pierwsza linie z "pajpa" wejsciowego

    FGets(pipe_in,linia,128 ); 

   printf(" odczytane z pipe %s",linia);

Close(pipe_out);
Close(pipe_in);

program po uruchomieniu wypisuje tekst "odczytane z pipe" .... i zwieszka. Jeśli macie jakiś pomysł jak przetunelować wyniki programu konsolowego przez pipe`y to byłbym bardzo wdzięczny za pomoc.

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem