Section courante

A propos

Section administrative du site

GETPPID

Demande l'identificateur de processus parent
Perl
 

Syntaxe

getppid

Retour

Valeur Description
variable Ces valeurs permet d'indiquer la valeur de l'identificateur parent.

Description

Cette fonction permet de connaître le numéro de processus d'un processus parent.

Exemple

Voici un exemple permet d'envoyer des listes de courriels massif (contenu dans une base de données MySQL) et de retenir sa position à partir sa position à l'aide du PID et de s'assurer ainsi qu'il n'envoi pas deux fois le même envois :

  1. #!/usr/bin/perl
  2.  
  3. # Ce script est destiné envoyer des courriels massif en risquant d'être interrompu
  4.  
  5. use strict;
  6. use warnings;
  7.  
  8. use CGI;
  9. use DBI;
  10. use HTML::Entities;
  11. use MIME::QuotedPrint;
  12. use MIME::Base64;
  13. use MIME::Words qw(:all);
  14. use Mail::Sendmail 0.75;
  15.  
  16. use constant Verbose => 1;
  17.  
  18. my $ServerMail = 'localhost';
  19.  
  20. # Remplace les balises avec les valeurs associées
  21. sub replaceHashHtml($%) {
  22.    my ($html, %args) = @_;
  23.    foreach my $k (keys(%args)){
  24.       if(defined($args{$k})) {
  25.            $html =~ s/$k/$args{$k}/g;
  26.       } else {
  27.            $html =~ s,Q$kE,,g;
  28.       };
  29.    };
  30.    return $html;
  31. }
  32.  
  33. sub envoicourriel($$$$;$$){
  34.    my ($to, $from, $sujet, $contenu, $attachement, $file) = @_;
  35.    my $boundary = 'END-OF-TRANSMISSION-AT-' . time() . '-GOODNIGHT';
  36.    my %msgErr = ();
  37.    my $filestr;
  38.    my @attachement;
  39.    my @file;
  40.    my @to = @$to;
  41.    my %mail;
  42.    if($attachement) {
  43.         @attachement = @$attachement;
  44.    } else {
  45.         @attachement = undef;
  46.    }
  47.    if($file) {
  48.         @file = @$file;
  49.    } else {
  50.      @file = undef;
  51.    }
  52.  
  53.    my $subjectEncodee = MIME::Words::encode_mimeword($sujet);
  54.    $subjectEncodee =~ s/s/_/g; # Compatibilité SquireMail
  55.  
  56.    %mail = (
  57.       'SMTP' => $ServerMail,
  58.       'from' => $from,
  59.       'to' => '',
  60.       'subject' => $subjectEncodee,
  61.       'content-type' => qq|multipart/alternative; boundary="$boundary"|,
  62.       'body' =>  ''
  63.    );
  64.  
  65.    $contenu = encode_base64(encode_entities($contenu, "200-377"));
  66.    $mail{'body'} = qq|nn--$boundarynContent-Transfer-Encoding: base64nContent-Type: text/html; charset="iso-8859-1"nnnn$contenun|;
  67.  
  68.    # Ajout de fichier joint sur le serveur
  69.   if( @attachement and scalar(@attachement) > 0 ) {
  70.       $mail{'content-type'} = qq|multipart/mixed; boundary="$boundary"|;
  71.  
  72.       while( $attachement = pop @attachement ) {
  73.          $filestr = '';
  74.          if( open (FILE, $attachement) ) {
  75.             binmode FILE;
  76.             while(<FILE>){ $filestr .= $_; };
  77.             close FILE;
  78.  
  79.             $mail{'body'} .= &joinFile($attachement,$filestr,$boundary);
  80.          };
  81.       };
  82.    };
  83.  
  84.    # Ajout des fichier joint par un input type=file de formulaire (fichier client)
  85.    if( @file and scalar(@file) > 0 ) {
  86.       $mail{'content-type'} = qq|multipart/mixed; boundary="$boundary"|;
  87.  
  88.       while( $attachement = pop @file ) {
  89.          $filestr = '';
  90.          while(<$attachement>) { $filestr .= $_; };
  91.  
  92.          $mail{'body'} .= &joinFile($attachement,$filestr,$boundary);
  93.       };
  94.    };
  95.  
  96.    $mail{body} .= qq|--$boundary--n|;
  97.  
  98.    foreach $_ (@to) {
  99.       $mail{'to'} = $_;
  100.       $msgErr{$_} = sendmail(%mail) || "Erreur: $Mail::Sendmail::errorn";
  101.    };
  102.  
  103.    return(%msgErr, $to, $from, $contenu)
  104. };
  105.  
  106. my ($Conn,$CurrLine,$sth,$Result);
  107. $Conn   = DBI->connect("DBI:mysql:database=gladir_db;host=localhost","root","",{'RaiseError' => 1});
  108.  
  109. my $CurrLineFileLog;
  110. my $CurrPID = getppid();
  111.  
  112. $sth = $Conn->prepare("UPDATE cdmsendmail SET pid = '" . $CurrPID . "' WHERE NOT deleted AND (CURDATE() >= dateToSend) AND (send = '' OR send IS NULL)");
  113. $Result = $sth->execute;
  114.  
  115. # Tentative pour demander la position actuellement rendu dans les résultats
  116. $sth = $Conn->prepare("SELECT * FROM `cdmsendmail` WHERE NOT deleted AND pid = " . $CurrPID . " AND (dateToSend >= CURDATE()) AND (send = '' OR send IS NULL) LIMIT 0,1");
  117. $Result = $sth->execute;
  118. if($CurrLine = $sth->fetchrow_hashref) {
  119.      $CurrLineFileLog = $CurrLine->{"filelog"};
  120. } else {
  121.      $CurrLineFileLog = "";
  122. }
  123.  
  124. $sth = $Conn->prepare("SELECT COUNT(*) As Compteur FROM `cdmsendmail` WHERE send = 'SUCCES' AND filelog = '".$CurrLineFileLog."'");
  125. $Result = $sth->execute;
  126. if($CurrLine = $sth->fetchrow_hashref) {
  127.      my $nbrCourrielValide = $CurrLine->{"Compteur"};
  128. }
  129.  
  130. $sth = $Conn->prepare("SELECT COUNT(*) As Compteur FROM `cdmsendmail` WHERE send = 'ERROR' AND filelog = '".$CurrLineFileLog."'");
  131. $Result = $sth->execute;
  132. if($CurrLine = $sth->fetchrow_hashref) {
  133.      my $nbrCourrielInvalide = $CurrLine->{"Compteur"};
  134. }
  135.  
  136. my ($msgErreur,$email);
  137. my $Found = 1;
  138. my $nbrCourrielValide = 0;
  139. my $nbrCourrielInvalide = 0;
  140. while($Found == 1) {
  141.      $sth = $Conn->prepare("SELECT ".
  142.                                  "id_sendmail, ".
  143.                                  "fromEmail, ".
  144.                                  "toEmail, ".
  145.                                  "subject, ".
  146.                                  "contenu, ".
  147.                                  "files, ".
  148.                                  "filelog, ".
  149.                                  "send, ".
  150.                                  "dateToSend, ".
  151.                                  "firstname, ".
  152.                                  "lastname, ".
  153.                                  "personnel ".
  154.                               "FROM cdmsendmail WHERE NOT deleted AND pid = '".$CurrPID."' AND (send = '' OR send IS NULL) LIMIT 0,1");
  155.      $Result = $sth->execute;
  156.      if($CurrLine = $sth->fetchrow_hashref) {
  157.              my $id_sendmail = $CurrLine->{'id_sendmail'};
  158.              if(Verbose) {
  159.                 print $CurrLine->{fromEmail} . " -> " . $CurrLine->{toEmail} . "n";
  160.              }
  161.  
  162.            my $contenu  = $CurrLine->{contenu};
  163.               if($CurrLine->{personnel}) {
  164.                      my %hashReplace = (
  165.                        "PRENOM_DESTINATAIRE" => $CurrLine->{firstname},
  166.                         "NOM_DESTINATAIRE" => $CurrLine->{lastname},
  167.                         "<var: ID_DESTINATAIRE />" => $CurrLine->{id_sendmail}
  168.  
  169.                   );
  170.                  $contenu = replaceHashHtml($contenu, %hashReplace);
  171.               }
  172.            ($msgErreur, $_, $_, $_) = envoicourriel([$CurrLine->{'toEmail'}], $CurrLine->{'fromEmail'}, $CurrLine->{'subject'}, $contenu,$CurrLine->{'files'},undef);
  173.            my %msgErreur = %$msgErreur;
  174.               foreach $email (keys %msgErreur) {
  175.                if($msgErreur{$email} eq '1') {
  176.                   $nbrCourrielValide++;
  177.                   $sth = $Conn->prepare("UPDATE `cdmsendmail` SET send='SUCCES',`dateSended`=NOW() WHERE id_sendmail = '" . $id_sendmail . "'");
  178.                      $Result = $sth->execute;
  179.                } else {
  180.                   $nbrCourrielInvalide++;
  181.                   $sth = $Conn->prepare("UPDATE `cdmsendmail` SET send='ERROR',`dateSended`=NOW() WHERE id_sendmail = '" . $id_sendmail . "'");
  182.                      $Result = $sth->execute;
  183.                };
  184.             };
  185.            $Found = 1;
  186.      } else {
  187.            $Found = 0;
  188.      }
  189. }
  190.  
  191. if(Verbose) {
  192.      print "Envoi réussis: " . $nbrCourrielValide . "\n";
  193.      print "Envoi échoué: " . $nbrCourrielInvalide . "\n";
  194.      print "Terminer !";
  195. }

Voir également

Langage de programmation - C pour Linux - Référence de procédures et fonctions - getppid

Dernière mise à jour : Dimanche, le 18 octobre 2015