1. Си / Говнокод #5949

    +142

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    #include <unistd.h>
    #include <stdlib.h>
    int main(int argc,char* argv[])
    {
    int fdp1[2],fdp2[2],fdp3[2],fdp4[2],fdp5[2];
    pipe(fdp1);
    pipe(fdp2);
    pipe(fdp3);
    pipe(fdp4);
    pipe(fdp5);
    if(fork()==0){
    close(1);dup(fdp1[1]);close(fdp1[1]);close(fdp1[0]);
    execl("/bin/cat","cat",argv[1],(char*)0);
    exit(1);
    }
    if(fork()==0){
    close(0);dup(fdp1[0]);close(fdp1[0]);close(fdp1[1]);
    close(1);dup(fdp2[1]);close(fdp2[1]);
    execl("/usr/bin/tr","tr","-cs","A-Za-z","\n",(char*)0);
    exit(2);
    }
    if(fork()==0){
    close(0);dup(fdp2[0]);close(fdp2[0]);close(fdp2[1]);
    close(fdp1[0]);close(fdp1[1]);
    close(1);dup(fdp3[1]);close(fdp3[1]);close(fdp3[0]);
    execl("/usr/bin/sort","sort",(char*)0);
    exit(3);
    }
     
    if(fork()==0){
    close(0);dup(fdp3[0]);close(fdp3[0]);close(fdp3[1]);
    close(fdp1[0]);close(fdp1[1]);
    close(fdp2[0]);close(fdp2[1]);
     
    close(1);dup(fdp4[1]);close(fdp4[1]);
    execl("/usr/bin/uniq","uniq","-c",(char*)0);
    exit(4);
    }
     
    if(fork()==0){
    close(0);dup(fdp4[0]);close(fdp4[0]);close(fdp4[1]);
    close(fdp1[0]);close(fdp1[1]);
    close(fdp2[0]);close(fdp2[1]);
    close(fdp3[0]);close(fdp3[1]);
    close(1);dup(fdp5[1]);close(fdp5[1]);
    execl("/usr/bin/sort","sort","-n",(char*)0);
    exit(5);
    }
    if(fork()==0){
    close(0);dup(fdp5[0]);close(fdp5[0]);close(fdp5[1]);
    close(fdp1[0]);close(fdp1[1]);
    close(fdp2[0]);close(fdp2[1]);
    close(fdp3[0]);close(fdp3[1]);
    close(fdp4[0]);close(fdp4[1]);
    execl("/usr/bin/tail","tail","-n",argv[2],(char*)0);
    exit(6);
    }
    close(fdp1[0]);close(fdp1[1]);
    close(fdp2[0]);close(fdp2[1]);
    close(fdp3[0]);close(fdp3[1]);
    close(fdp4[0]);close(fdp4[1]);
    close(fdp5[0]);close(fdp5[1]);
    while(wait(0)!=(-1));
    exit(0);
    }

    задача: подсчет повторяемости слов, и вывод слов указанной длины.

    Запостил: niXman, 11 Марта 2011

    Комментарии (13) RSS

    • мля, нет слов.

      и ведь навярняка же работает.

      за исключением отсутствуещей напрочь обработки ошибок - ни одной проблемы не вижу.

      ЗЫ а это `while(wait(0)!=(-1));` вообще убило.
      Ответить
    • shell изучен недостаточно. Наверное следующий шаг рефакторинга у него будет - вызов system()
      Ответить
      • по общепринятым стандартам кодирования, в suid-ных программах system() запрещен.

        это то что первым мне в глаза бросилось: программы запускаются по абсолютному пути используя execl(), а не execlp() (который умеет сам по $PATH программы находить).

        хотя такая программа очевидно не предназначена для suid'а...
        Ответить
        • Я к тому, что действия представленной программы следовало делать скриптом, а не заморачиваться с пайпами.
          system с suid'ом штука уязвимая, но ведь и execl такой же.
          Ответить
          • ты попутался: execl() в порядке - это execlp() с проблемой.
            Ответить
          • Ну так этот код -- буквальная запись конвейера средствами C+Posix. Сделано, очевидно, ради демонстрации, ради шутки, а не для реального применения. Потому не говнокод.
            Ответить
      • Зато тема fork() раскрыта досконально!
        Ответить
      • 77777 гет проёбан.
        Ответить
    • Это не говнокод, а кододрочество.
      Ответить
    • cat $1 | tr -cs "A-Za-z" "\n" | sort | uniq -c | sort -n | tail -n $2 Вывод слов начиная с конца в порядке убывания по частоте появления. Например слово bin в файле /etc/passwd появляется 27 раз итд.
      Для ./fork /etc/passwd 5 и для cat /etc/passwd | tr -cs "A-Za-z" "\n"| sort | uniq -c | sort -n | tail -n 5 тоже самое
      11 false
      13 bash
      17 var
      24 x
      27 bin
      Но длина тут не причём, а вобще идея мне нравится оригинально.
      Ответить
    • Мы забрызгивали Натку спермой с головы до ног! Буквально! Сперма была у нее на лице, на животе, на ногах, на волосах…
      Ответить

    Добавить комментарий