Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: Threaded or Forked FTP Backup with chdir

by BrowserUk (Pope)
on Dec 19, 2012 at 23:37 UTC ( #1009663=note: print w/ replies, xml ) Need Help??


in reply to Threaded or Forked FTP Backup with chdir

The code below almost works except for the chdir(). ... Is there a way to convert this program to use fork().
  1. How/why doesn't chdir work for you?
  2. How will converting to fork fix the chdir problem?
  3. Why is it necessary to chdir? Why not just supply the full path to put?

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

RIP Neil Armstrong


Comment on Re: Threaded or Forked FTP Backup with chdir
Re^2: Threaded or Forked FTP Backup with chdir
by Mimir (Initiate) on Dec 20, 2012 at 02:20 UTC
    1. chdir isn't unique to each thread. If you chdir in one thread they all change.
    2. changing to fork would allow chdir per fork because the memory is copied when forked
    3. This is an excellent point. You can't pass the full path to put but, you can pass a file handle.

    Here is the updated code:

    sub worker { my $tid = threads->tid; my( $Qwork, $Qresults ) = @_; my $ftp = Net::FTP->new($gFtpServer, Debug => 0); $ftp->login($gFtpUser, $gFtpPass) or print "unable to loging to $gF +tpServer: $ftp->message\n"; while(my $work = $Qwork->dequeue) { my ($result, $localFile); my (@workItem); @workItem = split (",", $work); chomp($workItem[0]); chomp($workItem[1]); chomp($workItem[2]); print "ftp dir: $workItem[0]\n"; print "local dir: $workItem[1]\n"; print "file: $workItem[2]\n"; $localFile = sprintf("%s%s",$workItem[1],$workItem[2]); open (my $fh, "<", $localFile) or print "unable to open file"; $ftp->cwd($workItem[0]) or print "unable to FTP change dir $work +Item[0]: $ftp->message\n"; $ftp->put($fh, $workItem[2]) or print "unable to FTP $workItem[2 +]: $ftp->message\n"; ## Process $work to produce $result ## $result = "$tid : result for workitem "; $Qresults->enqueue( $result ); } $Qresults->enqueue( undef ); ## Signal this thread is finished $ftp->quit; }
      chdir isn't unique to each thread. If you chdir in one thread they all change.

      Ah yes. I'd forgotten about that difference 'tween Windows and *nix.

      You can't pass the full path to put ...

      Really? Looking inside the module it does a sysopen which handles a fully qualified path just fine on my system.

      ... but, you can pass a file handle.

      Anyway, glad you got a solution.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      RIP Neil Armstrong

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1009663]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (13)
As of 2014-09-30 19:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (381 votes), past polls