(In C) Pfadangabe zur Datei dynamisch machen?

Buba235

Erfahrenes Mitglied
Hallo Leute!


Ich hab da mal ne Frage über die Pfadangabe zu Dateien. Ist es eigentlich möglich den Pfad zu einer Datei zu dynamisieren? Also dass das Programm so alle 60 Minuten auf eine neuere Datei zugreift!? So als Beispiel:
/home/verzeichnis1/verzeichnis1.1/verzeichnis1.2/verzeichnis1.3/datei.txt <- das wäre der erste Pfad und nach 60 Minuten würde es dann immer noch der selbe Pfad sein, aber eine neue Datei. Nach weiteren 60 Minuten wieder der selbe Pfad aber wieder eine neue Datei und so weiter. Aber nach 24 Stunden wäre es dann nicht nur eine neue Datei, sondern auch ein neuer Pfad. Etwa so:
/home/verzeichnis1/verzeichnis1.1/verzeichnis1.2/verzeichnis2/datei.txt
Jetzt wieder alle 60 Minuten eine neue Datei und alle 24 Stunden eine neues Verzeichnis! Das geht dann immer so weiter. Ich hoffe mal ihr könnt mir folgen. Wenn ja, habt ihr da ne Idee, ob es geht und wie es gehen kann?
 
Hallo,

ja wieso sollte das nicht gehen?
Dafür kannst du einen Timer programmieren, bspw einen Thread erstellen der
alle 60 Sekunden den Wert deiner Pfadvariablen ändert. Und dazu eventuell noch
einen 2ten Thread der alle 24h den Wert ändert...
Nach deinen Pfadangaben zu Urteilen programmierst du unter Linux. Um Threads
zu erstellen gibt es da die POSIX Threads (kurz pthread)... Musst dich nat. noch
drum kümmern das die beiden Threads(auch wenn ein gleichzeitiger Zugriff recht
unwahrscheinlich ist) beim Schreibzugriff auf deine Pfadvariable sich gegenseitig über
einen Mutex auschließen...

Gruß,

RedWing
 
Hallo!


Klingt nicht schlecht! muss aber sagen, dass ich im Moment (noch) nicht die Muse habe mich darüber her zu machen. Ich werd mich jetzt erst mal einlesen in Threads und Life- bzw. Deadlocks und dann schau ich mal wie ich da so voran komme. Danke schon mal für die Antwort. Ich hoffe mal ich kann auf euch hier zurückgreifen bei (sicherlich) auftauchenden Fragen. Also bis später dann mal.


Gruß Buba
 
Hallo,

ist zwar gut wenn du dich mit Deadlocks und so auch gleich auseinandersetzen willst, ist aber für dein Vorhaben nicht nötig ;)
Du musst lediglich wissen wie man einen Thread erstellt und wie man
wechselseitigen Ausschluss (sprich einen Mutex) realisiert...

Wikipedia gibt da auch schon ein paar sehr schöne Antworten mit weiterführenden
Links :
http://de.wikipedia.org/wiki/Thread_(Informatik)
http://de.wikipedia.org/wiki/Native_POSIX_Thread_Library
http://de.wikipedia.org/wiki/Mutex

Gruß,

RedWing
 
Hallo!


Ich hab grade nen Tipp von nem Kollegen bekommen, der mir auch sehr gefällt. Also ich fang mal von vorne an: Mein Programm wird (wenn es denn irgendwann fertig ist) in ein AWK-Skript eingebettet und von dort aus immer wieder aufgerufen. Dieses Skript schaut bereits nach den dynamischen Pfaden der Datei. also wäre es doch möglich dass ich einfach die Variablen (in denen die dynamische Pfadangabe liegt) als Parameter für mein C-Programm nehme. Das erspart mir doch dann die ganze Geschichte mit Threads usw. Nur kann ich innerhalb eines AWK-Skripts diese Variablen als Parameter an mein C-Programm übergeben? Ich selbst begeb mich hier auf absolutes Neuland und hab nicht die geringste Ahnung was ich machen kann.

Hier mal das AWK-Skript:

PHP:
# !/bin/bash

echo
echo "------ trace_merge started ------"
date
echo
echo "Start merging"

# Set folder name by date
foldername=`date +%y%m%d`

# Unmark if you want to run a special date
#foldername="050417"

# Wait for passing the hour or hour and day
sleep 180

# Look for new ....eth(x).gz files 
matchfiles="/home/tracer/trace_history/$foldername/2?___0?_eth1.gz"

# Do for all found hours ...

for filename in $(ls $matchfiles)
do
	# Define mergefile temp name (later GZIP will add .gz)
	mergefile=/home/tracer/trace_history/$foldername/`echo $filename | cut -c35-47`
	
	# Created mergefile
	echo "Destination file" $mergefile
	touch -a $mergefile
	
	# Filter for the hour files
	hourfiles=$mergefile"0"?"_eth"?".gz"
	
	echo
	echo "Source files" $hourfiles
	
	sleep 1
	
	# Merge the hour files
	/usr/local/bin/mergecap -w $mergefile $hourfiles
	
	# Compress the merged hour files
	gzip -f $mergefile
	
	# Change owner of files
	chown tracer:tracer $mergefile".gz"
done

# Remove ...eth(x) files after merge is completed
rm -f /home/tracer/trace_history/$foldername/20___0?_eth?.gz

echo
echo "Start filtering"

# Output dir
datadir="/home/tracer/trace_history/"$foldername
newdir=$datadir"/filter"

# Created new output dir
if [[ ! -d $newdir ]]
	then
	echo "Create: " $newdir
	mkdir $newdir
	
	# Change Owner of dir
	chown tracer:tracer $newdir
fi

sleep 3

# Look for new hour.gz files 
matchfiles="/home/tracer/trace_history/$foldername/20___.gz"

# Do for all found files
for filename in $(ls $matchfiles)
do
	echo "working on :" $filename #|cut -c-47
	
	resultfile=$newdir/`echo $filename | cut -c35-47`
	
	# echo $resultfile
	
	# Define outpu filter file names
	filterfileeth=$resultfile"_WLAN"
	filterfiletxt=$resultfile"_WLAN.txt"
	dbtextfile=$resultfile"_WLAN_DB.txt"
	
	# Create filterfile
	touch -a $filterfileeth
	touch -a $filterfiletxt
	
	sleep 3
	
	# Filter the RCPT
	/usr/local/bin/tethereal -r $filename -q -R "(radius and udp.port == 1645 or udp.port == 1812)" -w $filterfileeth
	
	# Create text RCPT file
	/usr/local/bin/tethereal -r $filterfileeth -V -n -R "(radius and udp.port == 1645 or udp.port == 1812)" >$filterfiletxt
	
	# Compress the filtered hour file
	gzip -f $filterfileeth
	
	# Change owner of files
	chown tracer:tracer $filterfileeth".gz"
	chown tracer:tracer $filterfiletxt
	
	# Run WLAN for database style

        script=/home/tracer/scripte/wlan.awk

        /bin/gawk -f $script $filterfiletxt >$dbtextfile
	
	# Change owner of file
	chown tracer:tracer $dbtextfile
	
        # Export data in MySQL database on alarm collector

        # Set variables for database access

        db_host="2.9.153.47"
        db_user="tracer"
        db_passwd="-pipmoni"
        db_name="wlan"
        db_table="trace_data"

        # export using mysql command

        /usr/bin/mysql -v -h $db_host -u $db_user $db_passwd -e "USE $db_name; LOAD  DATA LOCAL INFILE '$dbtextfile' 
INTO TABLE $db_table FIELDS TERMINATED BY ',' (SUB_TYPE, DATE, TIME, SRC_IP, DST_IP, PACKET_ID, USER, NAS_IP, REPLY_MSG,
HOUR, REALM, TYPE, LID_ISOCC, LID_CC, LID_AC, LID_NETWORK, H_QUARTERS, MIN, LN_OPERATOR, LN_COUNTRY, LN_LOCATION)"

	# Rename hourfile(s) after filter is completed
	
	parkfile=`echo $filename | cut -c-47`"_done.gz"
	
	mv $filename $parkfile
	
	# Change Owner of parkfile
	chown tracer:tracer $parkfile
	
	echo "finished with: " $parkfile
done
 
echo 
date
echo "------ trace_merge finished ------"
 
Zuletzt bearbeitet:
Zurück