SlideShare a Scribd company logo
Unix Programming with Perl Cybozu Labs, Inc. Kazuho Oku
Writing correct code tests aren’t enough tests don’t ensure that the code is correct writing correct code requires… knowledge of perl  and  knowledge of the OS the presentation covers the ascpects of unix programming using perl, including errno fork and filehandles Unix signals Oct 16 2010 Unix Programming with Perl
Errno Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” Is this OK? if (! -d $dir) { mkdir $dir or die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” (2) No! if (! -d $dir) { # what if another process created a dir # while we are HERE? mkdir $dir or die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” (3) The right way is to check the cause of the error when mkdir fails Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” (4) So, is this OK? if (mkdir $dir) { # ok, dir created } elsif ($! =~ /File exists/) { # ok, directory exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” (5) No! The message stored in $! depends on OS and / or locale. if (mkdir $dir) { # ok, dir created } elsif ($! =~ /File exists/) { # ok, directory exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
The right way to “create a dir if not exists” (6) The right way is to use Errno. use Errno (); if (mkdir $dir) { # ok, created dir } elsif ($! == Errno::EEXIST) { # ok, already exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
$! and Errno $! is a  dualvar is a number in numeric context (ex. 17) equiv. to the  errno  global in C is a string in string context (ex. “File exists”) equiv. to  strerror(errno)  in C the Errno module list of constants (numbers) that errno ($! in numeric context) may take Oct 16 2010 Unix Programming with Perl
How to find the Errnos perldoc -f mkdir  doesn’t include a list of errnos it might return see  man 2 mkdir man mkdir  will show the man page of the mkdir command specify section 2 for system calls specify section 3 for C library calls Oct 16 2010 Unix Programming with Perl
How to find the Errnos errnos on man include those defined by POSIX and OS-specific constants the POSIX spec. can be found at opengroup.org, etc. http://www.opengroup.org/onlinepubs/000095399/ Oct 16 2010 Unix Programming with Perl
Fork and filehandles Oct 16 2010 Unix Programming with Perl
Filehandles aren’t cloned by fork fork clones the memory image uses CoW (Copy-on-Write) for optimization fork does  not  clone file handles only increments the refcount to the file handle in the OS the file is left open until both the parent and child closes the file seek position and lock states are shared between the processes the same for TCP / UDP sockets Oct 16 2010 Unix Programming with Perl
File handles aren’t cloned by fork (2) Oct 16 2010 Unix Programming with Perl memory Parent Process Operating System File System lock owner, etc. File memory Another Process memory Child Process fork seek pos. / lock state, etc. File Control Info. open(file) seek pos. / lock state, etc. File Control Info. open(file)
Examples of resource collisions due to fork FAQ “ The SQLite database becomes corrupt” “ MySQL reports malformed packet” mostly due to sharing a single DBI connection created  before  calling fork SQLite uses file locks for access control file lock needed for each process, however after fork the lock is shared between the processes in the case of MySQL a single TCP (or unix) connection is shared between the processes Oct 16 2010 Unix Programming with Perl
Examples of resource collisions due to fork (2) The wrong code… my $dbh = DBI->connect(...); my $pid = fork; if ($pid == 0) { # child process $dbi->do(...); } else { # parent process $dbi->do(...); Oct 16 2010 Unix Programming with Perl
How to avoid resource collisions after fork close the file handle in the child process (or in the parent) right after fork only the refcount will be decremented.  lock states / seek positions do not change Oct 16 2010 Unix Programming with Perl
How to avoid collisions after fork (DBI) undef $dbh  in the child process doesn’t work since the child process will run things such as unlocking and / or rollbacks on the shared DBI connection the connection needs to be closed, without running such operations Oct 16 2010 Unix Programming with Perl
How to avoid collisions after fork (DBI) (2) the answer: use InactiveDestroy my $pid = fork; if ($pid == 0) { # child process $dbh->{InactiveDestroy} = 1; undef $dbh; ... } Oct 16 2010 Unix Programming with Perl
How to avoid collisions after fork (DBI) (3) if fork is called deep inside a module and can’t be modified, then… # thanks to tokuhirom, kazeburo BEGIN { no strict qw(refs); no warnings qw(redefine); *CORE::GLOBAL::fork = sub { my $pid = CORE::fork; if ($pid == 0) { # do the cleanup for child process $dbh->{InactiveDestroy} = 1; undef $dbh; } $pid; }; } Oct 16 2010 Unix Programming with Perl
How to avoid collisions after fork (DBI) (4) other ways to change the behavior of fork POSIX::AtFork (gfx) Perl wrapper for pthread_atfork can change the behavior of fork(2) called within XS forks.pm (rybskej) Oct 16 2010 Unix Programming with Perl
Close filehandles before calling exec file handles (file descriptors) are passed to the new process created by exec some tools (setlock of daemontools, Server::Starter) rely on the feature OTOH, it is a good practice to close the file handles that needn’t be passed to the exec’ed process, to avoid child process from accidentially using them Oct 16 2010 Unix Programming with Perl
Close file handles before calling exec (2) my $pid = fork; if ($pid == 0) { # child process, close filehandles $dbh->{InactiveDestroy} = 1; undef $dbh; exec ...; ... Oct 16 2010 Unix Programming with Perl
Close file handles before calling exec (3) Some OS’es have O_CLOEXEC flag designates the file descriptors to be closed when exec(2) is being called is OS-dependent linux supports the flag, OSX doesn’t not usable from perl? Oct 16 2010 Unix Programming with Perl
Unix Signals Oct 16 2010 Unix Programming with Perl
SIGPIPE “ my network application suddenly dies without saying anything” often due to not catching SIGPIPE a signal sent when failing to write to a filehandle ex. when the socket is closed by peer the default behavior is to kill the process solution: $SIG{PIPE} = 'IGNORE'; downside: you should consult the return value of print, etc. to check if the writes succeeded Oct 16 2010 Unix Programming with Perl
Using alarm alarm can be used (together with SIG{ALRM}, EINTR) to handle timeouts local $SIG{ALRM} = sub {}; alarm($timeout); my $len = $sock->read(my $buf, $maxlen); if (! defined($len) && $! == Errno::EINTR) { warn 'timeout’; return; } Oct 16 2010 Unix Programming with Perl
Pros and cons of using alarm + can be used to timeout almost all system calls (that may block) −  the timeout set by alarm(2) is a process-wide global (and so is $SIG{ALRM}) use of select (or IO::Select) is preferable for network access Oct 16 2010 Unix Programming with Perl
Writing cancellable code typical use-case: run forever until receiving a signal, and gracefully shutdown ex. Gearman::Worker Oct 16 2010 Unix Programming with Perl
Writing cancellable code (2) make your module cancellable -  my $len = $sock->read(my $buf, $maxlen); +  my $len; +  { +  $len = $sock->read(my $buf, $maxlen); +  if (! defined($len) && $! == Errno::EINTR) { +  return if $self->{cancel_requested}; +  redo; +  } +  } ... + sub request_cancel { +  my $self = shift; +  $self->{cancel_requested} = 1; + }  Oct 16 2010 Unix Programming with Perl
Writing cancellable code (3) The code that cancels the operation on SIGTERM $SIG{TERM} = sub { $my_module->request_cancel }; $my_module->run_forever(); Or the caller may use alarm to set timeout $SIG{ALRM} = sub { $my_module->request_cancel }; alarm(100); $my_module->run_forever(); Oct 16 2010 Unix Programming with Perl
Proc::Wait3 built-in wait() and waitpid() does not return when receiving signals use Proc::Wait3 instead Oct 16 2010 Unix Programming with Perl
Further reading Oct 16 2010 Unix Programming with Perl
Further reading this presentation is based on my memo for an article on WEB+DB PRESS if you have any questions, having problems on Unix programming, please let me know Oct 16 2010 Unix Programming with Perl

More Related Content

PPTX
Using the Power to Prove
PPT
Unix Programming with Perl 2
PPT
Unix Shell Scripting Basics
PPT
Shell Scripting
PDF
Put on Your Asynchronous Hat and Node
PPT
Unix And Shell Scripting
ODP
Отладка в GDB
PPT
Chap06
Using the Power to Prove
Unix Programming with Perl 2
Unix Shell Scripting Basics
Shell Scripting
Put on Your Asynchronous Hat and Node
Unix And Shell Scripting
Отладка в GDB
Chap06

What's hot (20)

PDF
Quick start bash script
PPTX
Penetration testing using python
PDF
Shell scripting
ODP
Perl one-liners
PDF
Shell scripting
PDF
Devinsampa nginx-scripting
PDF
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
DOCX
Quize on scripting shell
PPT
Unix 5 en
PDF
Shell Script
ODP
Clojure: Practical functional approach on JVM
ODP
Programming Under Linux In Python
PDF
PHP Internals and Virtual Machine
PPTX
Shell & Shell Script
KEY
Yapcasia2011 - Hello Embed Perl
DOCX
32 shell-programming
PDF
Redis & ZeroMQ: How to scale your application
PPTX
Shell Script Tutorial
PPTX
Unix shell scripts
ODP
OpenGurukul : Language : Shell Scripting
Quick start bash script
Penetration testing using python
Shell scripting
Perl one-liners
Shell scripting
Devinsampa nginx-scripting
various tricks for remote linux exploits  by Seok-Ha Lee (wh1ant)
Quize on scripting shell
Unix 5 en
Shell Script
Clojure: Practical functional approach on JVM
Programming Under Linux In Python
PHP Internals and Virtual Machine
Shell & Shell Script
Yapcasia2011 - Hello Embed Perl
32 shell-programming
Redis & ZeroMQ: How to scale your application
Shell Script Tutorial
Unix shell scripts
OpenGurukul : Language : Shell Scripting
Ad

Viewers also liked (20)

PDF
H2O - the optimized HTTP server
PDF
Reorganizing Website Architecture for HTTP/2 and Beyond
PDF
HTTP/2の課題と将来
PPT
Webアプリケーションの無停止稼働
PPTX
JSX 速さの秘密 - 高速なJavaScriptを書く方法
PPTX
例えば牛丼を避ける
PDF
H2O - making HTTP better
PDF
Developing the fastest HTTP/2 server
PDF
ウェブブラウザの時代は終わるのか 〜スマホアプリとHTML5の未来〜
PPT
ウェブアーキテクチャの歴史と未来
PPTX
illumos day 2014 SMB2
PDF
German Perl Workshop 2015 - Infrastruktur als Code
PPT
A Practical Event Driven Model
PDF
Gearinfive
PDF
Distribute the workload, PHPTek, Amsterdam, 2011
PDF
Apress.html5.and.java script.projects.oct.2011
ODP
Introducing Modern Perl
ODP
perl usage at database applications
PDF
Gearman
PDF
Dbi Advanced Talk 200708
H2O - the optimized HTTP server
Reorganizing Website Architecture for HTTP/2 and Beyond
HTTP/2の課題と将来
Webアプリケーションの無停止稼働
JSX 速さの秘密 - 高速なJavaScriptを書く方法
例えば牛丼を避ける
H2O - making HTTP better
Developing the fastest HTTP/2 server
ウェブブラウザの時代は終わるのか 〜スマホアプリとHTML5の未来〜
ウェブアーキテクチャの歴史と未来
illumos day 2014 SMB2
German Perl Workshop 2015 - Infrastruktur als Code
A Practical Event Driven Model
Gearinfive
Distribute the workload, PHPTek, Amsterdam, 2011
Apress.html5.and.java script.projects.oct.2011
Introducing Modern Perl
perl usage at database applications
Gearman
Dbi Advanced Talk 200708
Ad

Similar to Unix Programming with Perl (20)

PDF
The Ruby Guide to *nix Plumbing: Hax0R R3dux
PDF
Perl for System Automation - 01 Advanced File Processing
PDF
The Ruby Plumber's Guide to *nix
PDF
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
PPT
PHP CLI: A Cinderella Story
PDF
Processes in unix
PDF
Perl Programming - 03 Programming File
PPT
Linux basics
PPT
02 fundamentals
PPT
Perl Intro 8 File Handles
ODP
Perl - laziness, impatience, hubris, and one liners
PPT
11_UNIX_Processes_Including_Select.ppt
PDF
System calls
PDF
PPTX
04_ForkPipe.pptx
PPT
Chapter 10
PDF
Process management
The Ruby Guide to *nix Plumbing: Hax0R R3dux
Perl for System Automation - 01 Advanced File Processing
The Ruby Plumber's Guide to *nix
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
PHP CLI: A Cinderella Story
Processes in unix
Perl Programming - 03 Programming File
Linux basics
02 fundamentals
Perl Intro 8 File Handles
Perl - laziness, impatience, hubris, and one liners
11_UNIX_Processes_Including_Select.ppt
System calls
04_ForkPipe.pptx
Chapter 10
Process management

More from Kazuho Oku (20)

PDF
HTTP/2で 速くなるとき ならないとき
PDF
QUIC標準化動向 〜2017/7
PDF
TLS 1.3 と 0-RTT のこわ〜い話
PPTX
Recent Advances in HTTP, controlling them using ruby
PPTX
Programming TCP for responsiveness
PDF
Programming TCP for responsiveness
PPTX
TLS & LURK @ IETF 95
PPTX
HTTPとサーバ技術の最新動向
PPTX
ウェブを速くするためにDeNAがやっていること - HTTP/2と、さらにその先
PPTX
Cache aware-server-push in H2O version 1.5
PDF
HTTP/2時代のウェブサイト設計
PDF
H2O - making the Web faster
PPTX
JSON SQL Injection and the Lessons Learned
PPTX
JSX の現在と未来 - Oct 26 2013
PDF
JSX - 公開から1年を迎えて
PDF
JSX - developing a statically-typed programming language for the Web
PPTX
PPTX
JSX Optimizer
PPTX
JSX Design Overview (日本語)
PPTX
HTTP/2で 速くなるとき ならないとき
QUIC標準化動向 〜2017/7
TLS 1.3 と 0-RTT のこわ〜い話
Recent Advances in HTTP, controlling them using ruby
Programming TCP for responsiveness
Programming TCP for responsiveness
TLS & LURK @ IETF 95
HTTPとサーバ技術の最新動向
ウェブを速くするためにDeNAがやっていること - HTTP/2と、さらにその先
Cache aware-server-push in H2O version 1.5
HTTP/2時代のウェブサイト設計
H2O - making the Web faster
JSON SQL Injection and the Lessons Learned
JSX の現在と未来 - Oct 26 2013
JSX - 公開から1年を迎えて
JSX - developing a statically-typed programming language for the Web
JSX Optimizer
JSX Design Overview (日本語)

Recently uploaded (20)

PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Empathic Computing: Creating Shared Understanding
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Modernizing your data center with Dell and AMD
PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Network Security Unit 5.pdf for BCA BBA.
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
cuic standard and advanced reporting.pdf
Per capita expenditure prediction using model stacking based on satellite ima...
Empathic Computing: Creating Shared Understanding
Chapter 3 Spatial Domain Image Processing.pdf
Building Integrated photovoltaic BIPV_UPV.pdf
Spectral efficient network and resource selection model in 5G networks
Review of recent advances in non-invasive hemoglobin estimation
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Modernizing your data center with Dell and AMD
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
Encapsulation_ Review paper, used for researhc scholars
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
The AUB Centre for AI in Media Proposal.docx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Network Security Unit 5.pdf for BCA BBA.
“AI and Expert System Decision Support & Business Intelligence Systems”
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
cuic standard and advanced reporting.pdf

Unix Programming with Perl

  • 1. Unix Programming with Perl Cybozu Labs, Inc. Kazuho Oku
  • 2. Writing correct code tests aren’t enough tests don’t ensure that the code is correct writing correct code requires… knowledge of perl and knowledge of the OS the presentation covers the ascpects of unix programming using perl, including errno fork and filehandles Unix signals Oct 16 2010 Unix Programming with Perl
  • 3. Errno Oct 16 2010 Unix Programming with Perl
  • 4. The right way to “create a dir if not exists” Is this OK? if (! -d $dir) { mkdir $dir or die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
  • 5. The right way to “create a dir if not exists” (2) No! if (! -d $dir) { # what if another process created a dir # while we are HERE? mkdir $dir or die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
  • 6. The right way to “create a dir if not exists” (3) The right way is to check the cause of the error when mkdir fails Oct 16 2010 Unix Programming with Perl
  • 7. The right way to “create a dir if not exists” (4) So, is this OK? if (mkdir $dir) { # ok, dir created } elsif ($! =~ /File exists/) { # ok, directory exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
  • 8. The right way to “create a dir if not exists” (5) No! The message stored in $! depends on OS and / or locale. if (mkdir $dir) { # ok, dir created } elsif ($! =~ /File exists/) { # ok, directory exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
  • 9. The right way to “create a dir if not exists” (6) The right way is to use Errno. use Errno (); if (mkdir $dir) { # ok, created dir } elsif ($! == Errno::EEXIST) { # ok, already exists } else { die "failed to create dir:$dir:$!"; } Oct 16 2010 Unix Programming with Perl
  • 10. $! and Errno $! is a dualvar is a number in numeric context (ex. 17) equiv. to the errno global in C is a string in string context (ex. “File exists”) equiv. to strerror(errno) in C the Errno module list of constants (numbers) that errno ($! in numeric context) may take Oct 16 2010 Unix Programming with Perl
  • 11. How to find the Errnos perldoc -f mkdir doesn’t include a list of errnos it might return see man 2 mkdir man mkdir will show the man page of the mkdir command specify section 2 for system calls specify section 3 for C library calls Oct 16 2010 Unix Programming with Perl
  • 12. How to find the Errnos errnos on man include those defined by POSIX and OS-specific constants the POSIX spec. can be found at opengroup.org, etc. http://www.opengroup.org/onlinepubs/000095399/ Oct 16 2010 Unix Programming with Perl
  • 13. Fork and filehandles Oct 16 2010 Unix Programming with Perl
  • 14. Filehandles aren’t cloned by fork fork clones the memory image uses CoW (Copy-on-Write) for optimization fork does not clone file handles only increments the refcount to the file handle in the OS the file is left open until both the parent and child closes the file seek position and lock states are shared between the processes the same for TCP / UDP sockets Oct 16 2010 Unix Programming with Perl
  • 15. File handles aren’t cloned by fork (2) Oct 16 2010 Unix Programming with Perl memory Parent Process Operating System File System lock owner, etc. File memory Another Process memory Child Process fork seek pos. / lock state, etc. File Control Info. open(file) seek pos. / lock state, etc. File Control Info. open(file)
  • 16. Examples of resource collisions due to fork FAQ “ The SQLite database becomes corrupt” “ MySQL reports malformed packet” mostly due to sharing a single DBI connection created before calling fork SQLite uses file locks for access control file lock needed for each process, however after fork the lock is shared between the processes in the case of MySQL a single TCP (or unix) connection is shared between the processes Oct 16 2010 Unix Programming with Perl
  • 17. Examples of resource collisions due to fork (2) The wrong code… my $dbh = DBI->connect(...); my $pid = fork; if ($pid == 0) { # child process $dbi->do(...); } else { # parent process $dbi->do(...); Oct 16 2010 Unix Programming with Perl
  • 18. How to avoid resource collisions after fork close the file handle in the child process (or in the parent) right after fork only the refcount will be decremented. lock states / seek positions do not change Oct 16 2010 Unix Programming with Perl
  • 19. How to avoid collisions after fork (DBI) undef $dbh in the child process doesn’t work since the child process will run things such as unlocking and / or rollbacks on the shared DBI connection the connection needs to be closed, without running such operations Oct 16 2010 Unix Programming with Perl
  • 20. How to avoid collisions after fork (DBI) (2) the answer: use InactiveDestroy my $pid = fork; if ($pid == 0) { # child process $dbh->{InactiveDestroy} = 1; undef $dbh; ... } Oct 16 2010 Unix Programming with Perl
  • 21. How to avoid collisions after fork (DBI) (3) if fork is called deep inside a module and can’t be modified, then… # thanks to tokuhirom, kazeburo BEGIN { no strict qw(refs); no warnings qw(redefine); *CORE::GLOBAL::fork = sub { my $pid = CORE::fork; if ($pid == 0) { # do the cleanup for child process $dbh->{InactiveDestroy} = 1; undef $dbh; } $pid; }; } Oct 16 2010 Unix Programming with Perl
  • 22. How to avoid collisions after fork (DBI) (4) other ways to change the behavior of fork POSIX::AtFork (gfx) Perl wrapper for pthread_atfork can change the behavior of fork(2) called within XS forks.pm (rybskej) Oct 16 2010 Unix Programming with Perl
  • 23. Close filehandles before calling exec file handles (file descriptors) are passed to the new process created by exec some tools (setlock of daemontools, Server::Starter) rely on the feature OTOH, it is a good practice to close the file handles that needn’t be passed to the exec’ed process, to avoid child process from accidentially using them Oct 16 2010 Unix Programming with Perl
  • 24. Close file handles before calling exec (2) my $pid = fork; if ($pid == 0) { # child process, close filehandles $dbh->{InactiveDestroy} = 1; undef $dbh; exec ...; ... Oct 16 2010 Unix Programming with Perl
  • 25. Close file handles before calling exec (3) Some OS’es have O_CLOEXEC flag designates the file descriptors to be closed when exec(2) is being called is OS-dependent linux supports the flag, OSX doesn’t not usable from perl? Oct 16 2010 Unix Programming with Perl
  • 26. Unix Signals Oct 16 2010 Unix Programming with Perl
  • 27. SIGPIPE “ my network application suddenly dies without saying anything” often due to not catching SIGPIPE a signal sent when failing to write to a filehandle ex. when the socket is closed by peer the default behavior is to kill the process solution: $SIG{PIPE} = 'IGNORE'; downside: you should consult the return value of print, etc. to check if the writes succeeded Oct 16 2010 Unix Programming with Perl
  • 28. Using alarm alarm can be used (together with SIG{ALRM}, EINTR) to handle timeouts local $SIG{ALRM} = sub {}; alarm($timeout); my $len = $sock->read(my $buf, $maxlen); if (! defined($len) && $! == Errno::EINTR) { warn 'timeout’; return; } Oct 16 2010 Unix Programming with Perl
  • 29. Pros and cons of using alarm + can be used to timeout almost all system calls (that may block) − the timeout set by alarm(2) is a process-wide global (and so is $SIG{ALRM}) use of select (or IO::Select) is preferable for network access Oct 16 2010 Unix Programming with Perl
  • 30. Writing cancellable code typical use-case: run forever until receiving a signal, and gracefully shutdown ex. Gearman::Worker Oct 16 2010 Unix Programming with Perl
  • 31. Writing cancellable code (2) make your module cancellable - my $len = $sock->read(my $buf, $maxlen); + my $len; + { + $len = $sock->read(my $buf, $maxlen); + if (! defined($len) && $! == Errno::EINTR) { + return if $self->{cancel_requested}; + redo; + } + } ... + sub request_cancel { + my $self = shift; + $self->{cancel_requested} = 1; + } Oct 16 2010 Unix Programming with Perl
  • 32. Writing cancellable code (3) The code that cancels the operation on SIGTERM $SIG{TERM} = sub { $my_module->request_cancel }; $my_module->run_forever(); Or the caller may use alarm to set timeout $SIG{ALRM} = sub { $my_module->request_cancel }; alarm(100); $my_module->run_forever(); Oct 16 2010 Unix Programming with Perl
  • 33. Proc::Wait3 built-in wait() and waitpid() does not return when receiving signals use Proc::Wait3 instead Oct 16 2010 Unix Programming with Perl
  • 34. Further reading Oct 16 2010 Unix Programming with Perl
  • 35. Further reading this presentation is based on my memo for an article on WEB+DB PRESS if you have any questions, having problems on Unix programming, please let me know Oct 16 2010 Unix Programming with Perl