#!/usr/bin/perl use strict; use warnings; use File::Spec; # diese Funktion geht alle Prozess-Verzeichnisse in '/proc' durch # und schaut da in "fd" nach allen geöffneten Dateien (Werden als links abgelegt) # Im Link steht entweder der Pfad zur Datei oder die Pipe-, Socket-, oder Netzwerk ID # es muss ein absoluter Pfad übergeben werden # zurück gegeben wird die Prozess ID, # welche im allgemeinen >0 ist (der Kernel hat die ID 0 öffnen aber selbst keine Dateien) # undef wird zurück gegeben wenn kein Prozess die Datei geöffnet hat sub is_file_opend { my $file=shift; return unless $file; # go throu all processes for my $path (glob('/proc/*')) { next if($path!~m!/(\d+)$!); my $pid=$1; # get all opend files. for my $fref (glob("$path/fd/*")) { my $rfile=readlink($fref); return $pid if($rfile eq $file); } } return undef; } my $file='text.txt'; # testDatei öffnen open(my $fh, '<', $file) or die("ERROR open $file ($!)\n"); # Test mit Ausgabe der Prozessid if(my $pid=is_file_opend(File::Spec->rel2abs($file))) { print "$file is opend by $pid\n"; } else { print "$file is not opend\n"; } # ganz einfacher Test. if(is_file_opend(File::Spec->rel2abs($file))) { print "$file is opend\n"; } else { print "$file is not opend\n"; } close($fh);