Thread file in use (23 answers)
Opened by mark05 at 2011-01-12 10:05

topeg
 2011-01-13 16:26
#144658 #144658
User since
2006-07-10
2611 articles
BenutzerIn

user image
Da werde ich wohl etwas aus meinem Archiv kramen müssen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/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);


Das funktioniert auf allen Systemen die sich wie eine Unix verhalten und ein "/proc" Verzeichnis haben. Manchmal muss man es explizit mounten (in embedded Systemen z.B.)

View full thread file in use