WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Linux, UNIX, Open Source (http://www.wcm.at/forum/forumdisplay.php?f=13)
-   -   C-Programm unter Linux mit verschiedenen Befehlen (http://www.wcm.at/forum/showthread.php?t=228972)

donworld 20.06.2008 14:56

C-Programm unter Linux mit verschiedenen Befehlen
 
Hallo!

Ich hätte mal ein paar Fragen zu einem C-Programm unter Linux.

1. Welche Rolle spielen dabei die Systemfunktionen fork, wait, execlp und exit?

2. Warum zeigt der Zähler 'count', der die ausgeführten Befehle zählen soll, nicht den richtigen Wert an?

3. Was machen die einzelnen Befehle („ls“, „ps“ und „ln“), die das Programm zur Ausführung bringt, und welche Bedeutung haben ihre Ausgaben auf der
Konsole?

4. Unter welchen Bedingungen funktioniert der 3. Befehl („ln“) und was genau ist seine Wirkung?

5. Was genau geschieht bei dem Versuch, dem 4. Befehl auszuführen? Unter welchen Bedingungen würde dieser Befehl funktionieren?



#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

#define BUFFERSIZE 100
int main() {
char line[10];
int count = 0;
while( 1 ) {
printf( "Befehlscode eingeben: " );
fgets( line, BUFFERSIZE, stdin );
if( line[0] == '0' ) {
break;
}

if( fork() == 0 ) {
count++;
if( line[0] == '1' ) {
execlp( "ls", "ls", "-li", (char*)NULL );
} else if( line[0] == '2' ) {
execlp( "ps", "ps", "-H", (char*)NULL );
} else if( line[0] == '3' ) {
execlp( "ln", "ln", "x", "y", (char*)NULL );
} else if( line[0] == '4' ) {
execlp( "nonexistent", "x", "y", (char*)NULL );
}
perror( "FEHLER" );
exit( errno );
}
int status;
wait(&status);
}
printf( "Anzahl der ausgefuehrten Befehle: %d\n", count );
}

frankenheimer 21.06.2008 16:17

Der richtige Source sieht so aus:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

#define BUFFERSIZE 100
int main() {
char line[10];
int count = 0;
while( 1 ) {
printf( "Befehlscode eingeben: " );
fgets( line, BUFFERSIZE, stdin );
if( line[0] == '0' ) {
break;
}

if( fork() == 0 ) {
count++;
if( line[0] == '1' ) {
execlp( "ls", "ls", "-li", (char*)NULL );
} else if( line[0] == '2' ) {
execlp( "ps", "ps", "-H", (char*)NULL );
} else if( line[0] == '3' ) {
execlp( "ln", "ln", "x", "y", (char*)NULL );
} else if( line[0] == '4' ) {
execlp( "nonexistent", "x", "y", (char*)NULL );
}
perror( "FEHLER" );
exit( errno );
}
int status;
wait(&status);
}
printf( "Anzahl der ausgefuehrten Befehle: %d\n", count );
return 0;
}

Um unter linux das Programm zu kompilieren:
gcc -Wall program.c -o program

./program
1-4 als Option

Aber was soll dir das Programm zeigen.
Warum nicht einfach die MAN page anschauen:
man ps
man ls
man ln

PS: Prozesslisting mit optionen
LS: Directory listing mit optionen
ln: symlink (Verkünpfung)

lg. FHMER

donworld 28.06.2008 09:07

Erst mal vielen Dank für die Hilfe! Aber ich hätte da noch eine Frage zu execlp mit ln.

Wäre diese Aussage richtig:

"Wenn die Funktion ln die Datei x findet, weißt sie der Datei den Hardlink y zu."

Des Weiteren macht mir das nonexistent Probleme:

Ist mit wenn er existieren würde gemeint, das die Datei x existiert und deshalb eine Fehlermeldung ausgegben wird. Die Programm gibt jedoch die Fehlermeldung "FEHLER: No such file or directory" aus, wenn die Datei nicht existiert.

Gruß
donworld

donworld 28.06.2008 09:10

Des Weiteren beschäftigt mich die Frage:

Warum zeigt der Zähler 'count', der die ausgeführten Befehle zählen soll, nicht den richtigen Wert an?

Liegt das daran das count einem Kindprozess zugeordnet ist? Und wie könnte man das ändern.

Gruß
donworld


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag