Forum Programmation.c juste pour le fun je suis tombé sur ce bout de code très ....

Posté par  .
Étiquettes :
4
18
mai
2011

Je suis tombé par hazard sur ce bout de code :
Je trouve ça très drôle, comme concept... le programme auto-suicidaire...

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

/* 
 * is this the stupidest code all over the world ?
 * or any student first system call code ?
 *
 */

int main(int argc, char *argv[])
{
        if (argc != 2)
        {
                // if the fucking user doesn't give a signal code on args, then kill -9 program
                kill(getpid(), 9);
                return EXIT_SUCCESS;
        }
        // else apply user arg as signal sent to the program
        if (kill(getpid(), atoi(argv[1])) == -1 )
                perror(NULL);
        return EXIT_SUCCESS;
}
  • # Marrant

    Posté par  . Évalué à 3.

    Marrant j'imagine (je l'ai pas essayé) qu'une fois sur deux le signal n'arrive jamais à destination …

    Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)

  • # Simplifiable.

    Posté par  . Évalué à 2.

    la fonction raise() permet déjà de s'envoyer un signal.

    • [^] # Re: Simplifiable.

      Posté par  . Évalué à 2.

      kill() est un appel système.
      raise() est une fonction C (qui utilise kill).

      • [^] # Re: Simplifiable.

        Posté par  . Évalué à 4.

        brk est un appel système.
        malloc est une fonction C (qui utilise brk et mmap)

        Donc il faut remplacer malloc par brk ?

        • [^] # Re: Simplifiable.

          Posté par  . Évalué à 1.

          brk ne fait que déplacer l'adresse de fin du segment de données, la taille allouée a pour granularité celle d'une page mémoire.
          malloc/free apportent un confort d'utilisation car ils ont une valeur ajoutée par rapport à brk : malloc/free gèrent l'allocation de tailles quelconques, le chaînage des espaces libérés par free,.... Bref, un niveau d'abstraction largement supérieur à celui fourni par brk.

          raise(sig) se résume à un signal(getpid(), sig). J'ai du mal à voir en quoi cela simplifie le programme cité dans ce post.

      • [^] # Re: Simplifiable.

        Posté par  . Évalué à 1.

        raise est plus 'thread safe' que kill, cf man raise :

        Dans un programme monothreadé, elle est équivalente à :

        kill(getpid(), sig);
        

        Dans un programme multithreadé, elle est équivalente à :

        pthread_kill(pthread_self(), sig);
        

        Donc mieux autant utiliser raise sans trop se poser la question :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.