+#########################################################################
+sub fork_and_rename ($) {
+ my ($thread_num) = @_;
+
+ FORK: {
+ if (my $pid = fork) {
+ # parent here
+ # child process pid is available in $pid
+ return 0;
+ } elsif (defined $pid) { # $pid is zero here if defined
+
+ my $current_iteration=1;
+ while ($current_iteration <= $iterations) {
+ for (my $i=0; $i<$num_files; $i++) {
+ my $which = "";
+ if ($num_mounts > 0) {
+ $which = int(rand() * $num_mounts) + 1;
+ }
+
+ my $d = int(rand() * $num_dirs);
+ my $f1 = int(rand() * $num_files);
+ my $f2 = int(rand() * $num_files);
+ my $path_f1 = "${mountpt}${which}/${thread_num}.${d}/${f1}";
+ my $path_f2 = "${mountpt}${which}/${thread_num}.${d}/${f2}";
+
+ print "$SCRIPT_NAME - Thread $thread_num: [$$] $path_f1 $path_f2 ...\n" if !$silent;
+ my $rc = rename $path_f1, $path_f2;
+ print "$SCRIPT_NAME - Thread $thread_num: [$$] done: $rc\n" if !$silent;
+ }
+ if (($current_iteration) % 100 == 0) {
+ print "$SCRIPT_NAME - Thread $thread_num: " . $current_iteration . " operations [" . $$ . "]\n";
+
+ }
+ $current_iteration++;
+ }
+
+ print "$SCRIPT_NAME - Thread $thread_num: Done.\n";
+
+ exit 0;
+
+ } elsif ($! =~ /No more process/) {
+ # EAGAIN, supposedly recoverable fork error
+ sleep 5;
+ redo FORK;
+ } else {
+ # weird fork error
+ die "Can't fork: $!\n";
+ }
+ }
+
+}