amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Starten eines neuen Prozesses [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.10.2002, 12:54 Uhr

Inferno
Posts: 157
Nutzer
Hallo Leute,

könnt Ihr mir 'nen C-Code posten, wie man einen neuen Prozess starten kann?

Bsp:

--------------------- snip ---------------------

#include<stdio.h>
#include<stdlib.h>

int processFinished = 0;

void otherProcess() {
for(int i=0; i<10; printf("spawned Process: %in", i++));
processFinished = 1;
}

void startProcess(void *address) {
/* WAS MUSS HIER REIN ??? :-) */
}

void main() {
startProcess(&otherProcess);
for(int i=0;i<10;printf("regular Process: %in", i++));
while(!processFinished);
}

--------------------- snip ---------------------

Vielen Dank für Eure Hilfe,

Peter

[ - Antworten - Zitieren - Direktlink - ]

21.10.2002, 14:59 Uhr

thomas
Posts: 7716
Nutzer

Wie wär's, wenn du etwas Initiative zeigst und das Forum nach älteren Beiträgen zum selben Thema durchsuchst ?

http://home.t-online.de/home/thomas-rapp/download/multi.c


In dem Beispiel mußt du am Ende im Falle von "Subtask konnte nicht beendet werden" noch ein RemTask() einfügen, sonst kann es zu Crashes kommen, wenn der SubTask weiterläuft.

Ich hoffe, du willst nicht wirklich busy-wait Tasks schreiben wie in deinem Ausschnitt.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

21.10.2002, 19:50 Uhr

AC-FoX
Posts: 35
Nutzer
Eine weitere Fehlerquelle ist es auch, daß deine beiden Prozesse gleichzeitig auf die selbe CON: schreiben. Sowas verkraftet die CON: nicht und fängt an, den Speicherinhalt zu ploten.

Grüzi

[ - Antworten - Zitieren - Direktlink - ]

22.10.2002, 09:35 Uhr

thomas
Posts: 7716
Nutzer

Das glaube ich dir nicht. Sonst würde ja folgendes Script amok laufen:

run dir
run dir
run dir
run dir
run dir
run dir
run dir
dir

Außerdem, was ist "ploten" ?

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

22.10.2002, 14:16 Uhr

AC-FoX
Posts: 35
Nutzer
Zitat:
Das glaube ich dir nicht. Sonst würde ja folgendes Script amok laufen:

run dir
run dir
run dir
run dir
run dir
run dir
run dir
dir


Ich sitze jetzt grad nicht am Amiga, aber wird bei run nicht eine neue CON: vom System geöffnet, die den Output des neuen Prozesses aufnimmt? Bei einem CreateNewProcess() ohne Angabe eines definierten Dateistromes wird der des Mutter-Prozesses verwendet. Wenn jetzt beide Prozesse gleichzeitig und evtl auch sehr schnell hintereinander printf() machen, dann kann das die CON: überlasten.

Zitat:
Außerdem, was ist "ploten" ?

Wenn man es geschafft hat, die CON: zu trashen, dann ist sie in einem Modus, in dem sie einen unendlich großen String ausgeben will. Deshalb läuft der "Lese-Pointer" vom Anfang des korrekten Strings an durch den ganzen Speicher und printed alles in die CON:, was ihm da über den Weg läuft. Sieht lustig aus, läßt sich aber nicht mehr abstellen.
Ich kann ja mal ein Beispielprogramm machen.

Grüzi

[ - Antworten - Zitieren - Direktlink - ]

22.10.2002, 15:16 Uhr

thomas
Posts: 7716
Nutzer

Dann ist vermutlich plotten gemeint. Ploten gibt es nicht.

Run benutzt das gleiche Shell-Fenster. Ich habe gerade WinUAE zum Absturz gebracht mit

run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
run type s:startup-sequence
type s:startup-sequence

Scheint aber nur in Streßsituationen aufzutreten.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]

22.10.2002, 21:54 Uhr

AC-FoX
Posts: 35
Nutzer
Zitat:
Run benutzt das gleiche Shell-Fenster. Ich habe gerade WinUAE zum Absturz gebracht mit

Einfacher Absturz oder schönes Durchlaufen der CON:?

Zitat:
Scheint aber nur in Streßsituationen aufzutreten.

Ich vermute, daß das Ausführen der Write() Funktion von Prozess 1 vom Task-Switch unterbrochen wird und dabei zumindest ein Strukturelement durch das zweite Write() aus Prozess 2 überschrieben wird. Naja, man steckt ja nicht drin.
Bei meinen Programmen hat der Rechner immer Streß ;)

Grüzi

[ - Antworten - Zitieren - Direktlink - ]

23.10.2002, 01:06 Uhr

AC-FoX
Posts: 35
Nutzer
So, hier mal ein kleines testprog:

---start---
#include <exec/exec.h>
#include <proto/exec.h>
#include <dos/dos.h>
#include <dos/dostags.h>
#include <proto/dos.h>
#include <stdio.h>

struct Task* MainTask;
const char taskname[] = "testtask";

void taskfunc(void)
{
int i;

for(i=0; i<10; i++)
{
printf("..n");
}

Signal(MainTask, SIGBREAKF_CTRL_D);
}

int main(int argc, char** argv)
{
MainTask=FindTask(NULL);

CreateNewProcTags( NP_Entry, (APTR)taskfunc,
NP_Name, taskname,
TAG_END);

while(!(CheckSignal(SIGBREAKF_CTRL_D) & SIGBREAKF_CTRL_D))
{
printf(";");
}

printf("n");

exit(0);
}
---end---

Der Effekt tritt nicht immer auf, aber so nach etwa 5 mal ausprobieren hintereinander ist bei mir die CON: ruiniert.
Wenn man übrigens die New-Line Escape Sequence im Subtask wegläßt, dann kommt von dort u.U. gar kein Text mehr. Zumindest bei mir überschreibt dann der Haupttask mit seinem printf() die Subtask-Ausgabe.
Wie gesagt, es ist eine nette Fehlerquelle bei Programmierung mit Sub-Prozessen. Da es auch nicht immer bei 100% der Fällen auftritt macht es sich auch sehr gut bei der Fehlersuche :)

Grüzi

[ - Antworten - Zitieren - Direktlink - ]

23.10.2002, 09:45 Uhr

thomas
Posts: 7716
Nutzer

Das, was bei dir abstürzt ist mitnichten die CON-Shell, sondern der printf. Der ist halt nicht reentrant. Nimm dos.library/Printf und es funktioniert einwandfrei. Dabei kommt auch noch ein weiterer Fehler haraus: dein Beispiel erzeugt keine neue Runtime-Umgebung. Mit Printf kommt nämlich gar nichts, es sei denn du übergibst die Input() und Output() Handler.

Hier ist das korrigierte Programm:

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <dos/dostags.h>

struct Task* MainTask;
const char taskname[] = "testtask";

__saveds void taskfunc(void)
{
int i;

for(i=0; i<10; i++)
{
Printf("..n");
}

Signal(MainTask, SIGBREAKF_CTRL_D);
}


int main(int argc, char** argv)
{
MainTask=FindTask(NULL);

CreateNewProcTags( NP_Entry, (APTR)taskfunc,
NP_Name, taskname,
NP_Input, Input(),
NP_CloseInput, FALSE,
NP_Output, Output(),
NP_CloseOutput, FALSE,
TAG_END);

while(!(CheckSignal(SIGBREAKF_CTRL_D) & SIGBREAKF_CTRL_D))
{
Printf(";");
}

Printf("n");

return(0);
}

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: home.t-online.de/home/thomas-rapp/

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Starten eines neuen Prozesses [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.