daboss
Kaiser
Heyho,
Ich habe folgendes Progrämmchen versucht, zu schreiben. (Was es machen soll, steht weiter unten ).
Damit habe ich aber (mind.) 2 Probleme:
Zum einen funktioniert die Parameterübergabe offensichtlich nicht so, wie ich mir das Vorstelle. Die Stelle
führt zu
Ausserdem bekomme ich an der Stelle
einen
Die Aufgabe dazu:
Als Übung zur Vorlesung Unix/Linux Netzwerkprogrammierung sollen wir ein C-Programm implementieren, das ein, beim Start übergebenes, Verzeichnis alle 60 Sekunden auf die Existenz einer, beim Start übergebenen, Datei überwacht. Existiert die Datei, soll sie gelöscht, der Inhalt des obigen Verzeichnisses mit Hilfe von "ls" ausgegeben und das Programm beendet werden. Ausserdem soll sich das Ding bei Sstrg+C und kill geordnet beenden...
Ich habe folgendes Progrämmchen versucht, zu schreiben. (Was es machen soll, steht weiter unten ).
Code:
/*
* filewatch.c
*
* Created on: 27.11.2008
* Author: alex
*/
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char* argv[]){
//Parametercheck:
if(argc != 5){
printf("AnzParam: %i\n", argc);
printf("Aufruf: filewatch -d directory -f file\n");
return 1;
//Debugausgabe:
}else{
int i;
for(i = 0;i<5;++i){
printf("arg %i: %s\n", i, argv[i]);
}
}
//Falls die richtigen Parameter uebergeben
//wurden, diese Uebernehmen:
int iD, iF = 1;
char *cD = "\0";
char *cF = "\0";
if(strcmp("-d", argv[1])){
printf("Dir an 1\n");
iD = 0;
cD = (char*) calloc(strlen(argv[2]), sizeof(char));
if(cD == NULL){
printf("Kein Platz fuer die Parameteruebergabe!");
return 1;
}else{
cD = argv[2];
}
}
if(strcmp("-d", argv[3])){
printf("Dir an 3\n");
printf("argv[3] [%s], argv[4] [%s]\n", argv[3], argv[4]);
iD = 0;
cD = (char*) calloc(strlen(argv[4]), sizeof(char));
if(cD == NULL){
printf("Kein Platz fuer die Parameteruebergabe!");
return 1;
}else{
cD = argv[4];
}
}
if(strcmp("-f", argv[1])){
printf("File an 1\n");
iF = 0;
cF = (char*) calloc(strlen(argv[2]), sizeof(char));
if(cF == NULL){
printf("Kein Platz fuer die Parameteruebergabe!");
return 1;
}else{
cF = argv[2];
}
}
if(strcmp("-f", argv[3])){
printf("File an 3\n");
iF = 0;
cF = (char*) calloc(strlen(argv[2]), sizeof(char));
if(cF == NULL){
printf("Kein Platz fuer die Parameteruebergabe!");
return 1;
}else{
cF = argv[4];
}
}
//Falsche Parameter -> Abbruch:
if(iF == 1 || iD == 1){
printf("Aufruf: filewatch -d directory -f file\n");
return 1;
}
printf("Dir %s\n", cD);
printf("File %s\n", cF);
//Pfad zur Datei basteln:
char *caPfad = strcat(cF, "/");
caPfad = strcat(cF, cD);
printf("Pfad: %s\n", caPfad);
//Datei oeffnen und entsprechend reagieren:
int iFDesc = (-1);
while(iFDesc == (-1)){
//Crtl-C abfangen
if(sigaction(SIGINT, NULL, NULL)){
printf("Vom Benutzer abgebrochen.\n");
return 0;
}
//kill abfangen
if(sigaction(SIGKILL, NULL, NULL)){
printf("Via kill beendet.\n");
return 0;
}
int iFDesc = open(caPfad, O_RDONLY);
if(iFDesc == -1){
printf("Datei nicht vorhanden!\n");
sleep(60);
}else{
printf("Datei vorhanden!\n");
unlink(caPfad);
printf("Datei geloescht.\nInhalt des Verzeichnisses:\n");
char *caBefehl = (char*) calloc(strlen(cD) + 10, sizeof(char));
if(caBefehl == NULL){
printf("Kein Platz fuer den Befehl...\n");
return 1;
}
caBefehl = strcat("/bin/ls", cD);
printf("Befehl: %s\n", caBefehl);
// execl(caBefehl, "", NULL);
return 0;
}
}
return 1;
}
Zum einen funktioniert die Parameterübergabe offensichtlich nicht so, wie ich mir das Vorstelle. Die Stelle
Code:
if([B]strcmp("[U]-d[/U]", argv[3][/B])){
printf("Dir an 3\n");
printf("argv[3] [%s], argv[4] [%s]\n", argv[3], argv[4]);
iD = 0;
cD = (char*) calloc(strlen(argv[4]), sizeof(char));
if(cD == NULL){
printf("Kein Platz fuer die Parameteruebergabe!");
return 1;
}else{
cD = argv[4];
}
}
.alex@asterix:~$ workspace/UNP.FU.03Filewatch/Release/UNP.FU.03Filewatch -d /opt -f test
arg 0: workspace/UNP.FU.03Filewatch/Release/UNP.FU.03Filewatch
arg 1: -d
arg 2: /opt
arg 3: -f
arg 4: test
Dir an 3
argv[3] [-f], argv[4] [test]
File an 1
Dir test
File /opt
(...)
Ausserdem bekomme ich an der Stelle
Code:
caBefehl = strcat("/bin/ls", cD);
Kann mir da bitte jemand weiterhelfen?(...)Pfad: /opt/test
Datei vorhanden!
Datei geloescht.
Inhalt des Verzeichnisses:
Segmentation fault
Die Aufgabe dazu:
Als Übung zur Vorlesung Unix/Linux Netzwerkprogrammierung sollen wir ein C-Programm implementieren, das ein, beim Start übergebenes, Verzeichnis alle 60 Sekunden auf die Existenz einer, beim Start übergebenen, Datei überwacht. Existiert die Datei, soll sie gelöscht, der Inhalt des obigen Verzeichnisses mit Hilfe von "ls" ausgegeben und das Programm beendet werden. Ausserdem soll sich das Ding bei Sstrg+C und kill geordnet beenden...
Zuletzt bearbeitet: