fork() und excelp benutzen zum programm starten



  • Hallo mein Aufgabe ist es: Einlesen aus der Standardeingabe Implementiert zunächst ein einfaches Menü, welches mittels
    printf(3) ausgegeben wird. Das Menü soll den Benutzer auffordern einen von vier möglichen
    Menüeinträgen auszuwählen. Anschließend soll das entsprechende Kommando mittels printf(3) ausgegeben
    werden. Die möglichen Programmeinträge sollen „geany“, „ps“ , „xterm“ und „top“ sein.2.
    Die Eingabemöglichkeit für den Benutzer sollen die Tasten „g“, „p“, „x“ und „o“ sein. Nach einer
    Eingabe soll das ausgewählte Kommando ausgegeben werden und erneut die Möglichkeit zur Eingabe
    eines Kommandos bestehen. Das Einlesen von Tasten ist mit der Funktion scanf(3) möglich. Das
    Eingabe-Formatzeichen „%c“ ermöglicht das Lesen eines Zeichens in eine char-Variable. Drückt der
    Benutzer die Tastenkombination <Ctrl+c>, so soll das Programm beendet werden.

    Die Aufgabe habe ich wie folgt gelöst:

    #include<stdio.h>
    char choice;
    printf("--Menu--");
    printf("geany");
    printf("top");
    printf("xterm");
    printf("Please select:");
    scanf("%c",&choice);
    if(choice==g);
    printf("geany");
    else if(choice==t)
    printf("top");
    else if(choice==x)
    printf("xterm");
    

    So diesen teil habe ich hinbekommen zwar ist es jetzt schlecht formatiert aber klappt zumindest.

    Die 2.teilaufgabe ist es mit fork() und excelp() die programme jetzt iwie zu starten und ich weis leider nicht wie das geht..
    die datei heißt bei mir : datei1.c und befindet sich aufm desktop.
    Hoffe ihr könnt mir da weiter helfen..

    Mfg



  • Habe zu dem folgendes noch ausprobiert unter dem code

    pid_t child = fork();
    if(child<0)
    {
      perror("fork()error");
      exit(-1);
      execlp("home/studi/Desktop","datei1",NULL);
      return 0;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    canyakan95 schrieb:

    So diesen teil habe ich hinbekommen zwar ist es jetzt schlecht formatiert aber klappt zumindest.

    Das klappt ganz sicher nicht. Benutze Copy&Paste! Sonst finden wir bloß Fehler, die dir beim Abschreiben passiert sind.

    In diesem Sinne:

    pid_t child = fork();
    if(child<0)
    {
      perror("fork()error");
      exit(-1);
      execlp("home/studi/Desktop","datei1",NULL);
      return 0;
    }
    

    Der Fehler im Programmfluss ist ja offensichtlich. Ist das nun ein Fehler der dir beim Abtippen passiert ist oder hast du wirklich geglaubt, das könnte funktionieren? Wir wissen es nicht und ich will auch nicht raten, bevor du den richtigen Code postest. Abgesehen davon sind da noch mehr Fehler drin als der offensichtliche Logikfehler, aber dafür gilt das gleiche: Falsch abgeschrieben oder echt? Ohne es zu wissen, verschwendet niemand seine Zeit mit einer Analyse.



  • Hey habe genau das hingeschrieben als code..beim compilieren kamen keine fehler raus ..aber wie gesagt da tut sich einfach nichts..
    Hoffe kannst mir da weiter helfen

    Mfg


  • Mod

    canyakan95 schrieb:

    Hey habe genau das hingeschrieben als code..beim compilieren kamen keine fehler raus

    Verarschen kann ich mich auch selber.

    Hoffe kannst mir da weiter helfen

    Können? Sicher. Wollen? Bestimmt nicht, nachdem du hier mit derart dreiste Lügen auffährst.



  • #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/types.h>
    
    int main()
    {
    
    	char choice; 
    	printf("--Menu--\n");
    	printf("geany\n");
    	printf("ps\n");
    	printf("xterm\n");
    	printf("top\n");
    
    	printf("Please select: ");
    	scanf("%c",&choice);
    	if(choice=='g')
    	{
    		printf("geany\n");
    		}
    		else if(choice=='p')
    		{
    			printf("ps\n");}
    			else if(choice=='x')
    			{
    				printf("xterm\n");}
    				else if(choice=='t')
    				{
    					printf("top\n");
    					}
    	pid_t child = fork();
    	if(child<0)
    	{
    		perror("fork()error");
    		exit(-1);
    		}
    		execlp("/home/studi/Desktop", "datei1",NULL);
    	return 0;
    	}
    

    edit nman: BBCode aktiviert.



  • Keine lüge kann iwie mein code nicht kopieren will iwe nicht klappen...
    Das was du da gerade siehst ist mein orginal code und lässt sich auch ohne fehler compieren
    Mfg


  • Mod

    Und? Fällt dir was auf, wenn du diesen Code mit deinen vorherigen Beiträgen vergleichst? Sie sind nicht identisch.

    Und schalt BB-Code nicht aus in deinen Beiträgen. So langsam solltest du mitbekommen haben, dass deine Beiträge unlesbar sind.

    So lange du dich weder vernünftig artikulieren, noch lesbare Beiträge posten, noch klare Fragen stellen kannst, habe ich jedenfalls keine Motivation, hier groß zu helfen. Sieht mir zu sehr nach einem schlechten Trollversuch aus, gerade die Zeile mit dem execlp. Ich habe schon viel zu viel Zeit in diesem Thread verschwendet.



  • Hey
    Sage mir doch dann bitte mal , wie ich die zeile mit execlp verbessern kann.
    Ich weiß selber, dass ich das mit dem ececlp nicht richtig verstanden habe.
    Mit freundlichen Grüßen



  • Gute Güte, der Code ist ja schauderhaft formatiert. Hier, einmal durch astyle gejagt:

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int main()
    {
        char choice;
        printf("--Menu--\n");
        printf("geany\n");
        printf("ps\n");
        printf("xterm\n");
        printf("top\n");
    
        printf("Please select: ");
        scanf("%c",&choice);
        if(choice=='g')
        {
            printf("geany\n");
        }
        else if(choice=='p')
        {
            printf("ps\n");
        }
        else if(choice=='x')
        {
            printf("xterm\n");
        }
        else if(choice=='t')
        {
            printf("top\n");
        }
        pid_t child = fork();
        if(child<0)
        {
            perror("fork()error");
            exit(-1);
        }
        execlp("/home/studi/Desktop", "datei1", NULL);
        return 0;
    }
    

    Check doch mal mit perror, was beim execlp schiefgegangen ist, dann findest du den Fehler auch alleine.



  • canyakan95 schrieb:

    Nach einer Eingabe soll das ausgewählte Kommando ausgegeben werden und erneut die Möglichkeit zur Eingabe eines Kommandos bestehen.

    Das fehlt noch.

    Schau dir nochmal man fork an: es gibt -1 im Fehlerfall zurück, das hast du ja schon abgefangen.
    Wenn es erfolgreich ist, gibt es aber zwei(!) Rückgabewerte (da es dann zwei Prozesse sind!):
    0: Der neu erstellte Kindprozess bekommt 0 zurückgegeben.

    0: Der Elternprozess bekommt die Prozess-ID vom Kindprozess zurückgegeben.

    Schau dir dann auch nochmal man execlp an... so wie ich die Aufgabe verstanden habe, soll "geany" gestartet werden, wenn man 'g' in das Programm eingibt. Das erste Argument (das argv[0] vom zu startendem Programm) ist per Konvention der Programmname. Das letzte muss (char*)NULL sein.



  • Mach doch erstmal den ersten Teil richtig.

    Es sollte nur eine Stelle geben wo steht

    printf("Ihre Wahl: %s", programmname);
    

    Was passiert bei Fehleingaben?
    Wo ist die Wiederholung?
    Wo ist die CTRL-C Behandlung?

    Wenn das läuft, kannst du noch das fork und execlp nachrüsten.
    Dann ist es auch klar wo das hinkommt und welche Parameter du nehmen musst.



  • Hey
    wollte sagen das ich ein programmier anfänger und deswegen noch schwierigkeiten mit dem ganzen habe.
    Ich muss meine arbeit heute noch abgeben hoffe ihr könnt meine fehler jetzt verbessern und mir weiterhelfen.
    Habe gerade das ausprobiert wollte aber iwie nicht klappen.Die komilierung ist zwar erfolgreich, aber mein programm startet nicht.
    Mfg

    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/types.h>
    
    int main()
    {
    
    	char choice; 
    	printf("--Menu--\n");
    	printf("geany\n");
    	printf("ps\n");
    	printf("xterm\n");
    	printf("top\n");
    
    	printf("Please select: ");
    	scanf("%c",&choice);
    	if(choice=='g')
    	{
    		printf("geany\n");
    		}
    		else if(choice=='p')
    		{
    			printf("ps\n");}
    			else if(choice=='x')
    			{
    				printf("xterm\n");}
    				else if(choice=='t')
    				{
    					printf("top\n");
    					}
    	pid_t child = fork();
    	if(child<0)
    	{
    		perror("fork()error");
    		exit(-1);
    		}
    	if(child!=0)
    	{
    		printf("Im the parent %d, my child is %d\n", getpid(),child);
    		sleep(1);
    		}
    
    	else
    	{
    		printf("Im the child %d, my parent is %d\n", getpid(),getppid());
    		}
    		execl("/home/studi/Desktop","datei1.c",NULL);
    	return 0;
    	}
    


  • canyakan95 schrieb:

    Habe gerade das ausprobiert wollte aber iwie nicht klappen.Die komilierung ist zwar erfolgreich, aber mein programm startet nicht.

    Wenn ich den Code kopiere und übersetze startet das Programm durchaus...
    Programmieren sollte nicht aus "probieren" bestehen...
    Gewöhnt dir eine saubere Formatierung an, das erleichtet schon einiges.

    Du hast noch nicht einmal den ersten Aufgabenteil gelöst:

    canyakan95 schrieb:

    Nach einer Eingabe soll das ausgewählte Kommando ausgegeben werden und erneut die Möglichkeit zur Eingabe eines Kommandos bestehen.

    Zum zweiten Teil:

    Das execlp willst du im Kindprozess aufrufen.

    Für "ps" sollte es in etwa so aussehen: execlp("ps", "ps", (char *)NULL); bzw execlp(name, name, (char *)NULL); (wenn name "ps" enthält).



    1. Dein Programm erfüllt nicht einmal Teil 1 der Aufgabe.
    2. Der Aufruf von execlp ist falsch.
    3. selbst wenn der dann richtig ist, wirst du datei1.c nicht starten können, da es eine C-Datei ist.
    4. du sollst geany oder ps oder top oder xterm mit execlp starten.

    Erfülle den ersten Teil der Aufgabe:

    tue
        Ausgabe Menü
    
        Eingabe Buchstabe
    
        setze die Variable name entsprechend der Eingabe (hier keine Ausgabe)
    
        gib name aus, wenn Buchstabe gültig war (nur einmal an dieser Stelle)
        (hier kommt später das fork und exexlp hin)
    
      solange ( kein CTRL-C eingegeben wurde)
    

    Und wenn das läuft kannst du fork und execlp einbauen.
    Im Augenblick hast du für execlp nicht einmal den Namen für das Programm parat.


Anmelden zum Antworten