amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Starten eines neuen Prozesses [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2002-10-21, 12:54 h

Inferno
Posts: 157
User
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

[ - Answer - Quote - Direct link - ]

2002-10-21, 14:59 h

thomas
Posts: 7717
User

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/

[ - Answer - Quote - Direct link - ]

2002-10-21, 19:50 h

AC-FoX
Posts: 35
User
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

[ - Answer - Quote - Direct link - ]

2002-10-22, 09:35 h

thomas
Posts: 7717
User

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/

[ - Answer - Quote - Direct link - ]

2002-10-22, 14:16 h

AC-FoX
Posts: 35
User
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

[ - Answer - Quote - Direct link - ]

2002-10-22, 15:16 h

thomas
Posts: 7717
User

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/

[ - Answer - Quote - Direct link - ]

2002-10-22, 21:54 h

AC-FoX
Posts: 35
User
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

[ - Answer - Quote - Direct link - ]

2002-10-23, 01:06 h

AC-FoX
Posts: 35
User
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

[ - Answer - Quote - Direct link - ]

2002-10-23, 09:45 h

thomas
Posts: 7717
User

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/

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Starten eines neuen Prozesses [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.