суббота, 28 июля 2012 г.

Jessie

Стало известно имя следующего после Wheezy восьмого релиза Debian - Jessie.
Джесси - очень редкая игрушка, созданная по образу героини вымышленного телевизионного шоу "Загон Вуди", в котором помимо неё участвовали шериф Вуди, пожилой старатель Пит и Булзай, лошадь Вуди. Волосы Джесси сплетены в косичку. Она свежая, храбрая и очень ловкая. Однако кукла бывает грустна и недоверчива, поскольку была забыта своим владельцем. Годы, проведённые в гараже сделали её замкнутой и боящейся темноты.

Пост можно считать дополнением к списку имён героев, в честь которого именовались релизы Debian.

Источники:

четверг, 19 июля 2012 г.

lseek

Роберт Лав, как оказалось, пишет довольно увлекательно. Узнал для себя немало нового из его книги "Linux. Системное программирование". Одним из открытий хочу поделиться.
Системный вызов lseek() предназначен для установки позиции в файле, соответствующем файловому дескриптору. Однако у него есть одно забавное применение. Возможно использовать lseek() для 'перемотки' файла за его(файла) предел. Если после этого записать что-то в текущую позицию, место между концом файла и позицией заполнится нулями.

воскресенье, 8 июля 2012 г.

Main

Прогуливаясь по файловой системе, обнаружил в закромах небольшой файл с кодом. Взглянув на него, я вспомнил, что некоторое время назад пытался понять можно ли в Си вызвать функцию main рекурсивно. Тогда я не закончил исследование - вероятно, не хватило навыка работы с указателями.
Оказывается, main ничем от других функций не отличается (помимо того, что является точкой входа в программу). Приведённый ниже код компилируется с самыми "жёсткими" флагами и успешно работает (печатает переданные аргументы).

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1) {
        printf("%s\n", argv[1]);
        main(argc - 1, argv + 1);
    }
    return 0;
}

четверг, 5 июля 2012 г.

KISS

Давайте взглянем на код пары простых программ. Первая поставляется с пакетом GNU coreutils во множестве дистрибутивов Linux. Программа называется true и обычно устанавливается в /bin/true :

/* Exit with a status code indicating success.
   Copyright (C) 1999-2012 Free Software Foundation, Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include <config.h>
#include <stdio.h>
#include <sys/types.h>
#include <system.h>

/* Act like "true" by default; false.c overrides this.  */
#ifndef EXIT_STATUS
# define EXIT_STATUS EXIT_SUCCESS
#endif

#if EXIT_STATUS == EXIT_SUCCESS
# define PROGRAM_NAME "true"
#else
# define PROGRAM_NAME "false"
#endif

#define AUTHORS proper_name ("Jim Meyering")

void
usage (int status)
{
  printf (_("\
Usage: %s [ignored command line arguments]\n\
  or:  %s OPTION\n\
"),
          program_name, program_name);
  printf ("%s\n\n",
          _(EXIT_STATUS == EXIT_SUCCESS
            ? N_("Exit with a status code indicating success.")
            : N_("Exit with a status code indicating failure.")));
  fputs (HELP_OPTION_DESCRIPTION, stdout);
  fputs (VERSION_OPTION_DESCRIPTION, stdout);
  printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
  emit_ancillary_info ();
  exit (status);
}

int
main (int argc, char **argv)
{
  /* Recognize --help or --version only if it's the only command-line
     argument.  */
  if (argc == 2)
    {
      initialize_main (&argc, &argv);
      set_program_name (argv[0]);
      setlocale (LC_ALL, "");
      bindtextdomain (PACKAGE, LOCALEDIR);
      textdomain (PACKAGE);

      atexit (close_stdout);

      if (STREQ (argv[1], "--help"))
        usage (EXIT_STATUS);

      if (STREQ (argv[1], "--version"))
        version_etc (stdout, PROGRAM_NAME, PACKAGE_NAME, Version, AUTHORS,
                     (char *) NULL);
    }

  exit (EXIT_STATUS);
}

Вторая относится к пакету "sbase" проекта suckless.org.

/* See LICENSE file for copyright and license details. */
#include <stdlib.h>

int
main(void)
{
 return EXIT_SUCCESS;
}

Обе программы делают одну вещь. Ничего. Просто выходят, возвращая значение "успешно". Кто следует идеям UNIX? Кто следует здравому смыслу? Решайте сами.

Ссылки:

воскресенье, 17 июня 2012 г.

TID

В интернете свободно доступна интересная и полезная книга о программировании в Линуксе: Advanced Linux Programming. К несчастью, некоторые темы устарели. Одна из них - 4.5 GNU/Linux Thread Implementation. В книге говорится, что треды GNU/Linux реализованы как процессы. Следующий код должен это подтвердить, но он этого не делает:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *thread_fun(void *arg)
{
    fprintf(stderr, "child thread pid is %d\n", (int)getpid());
    while(1);
    return NULL;
}

int main(void)
{
    pthread_t thread;
    fprintf(stderr, "main thread pid is %d\n", (int)getpid());
    pthread_create(&thread, NULL, &thread_fun, NULL);
    while(1);
    return 0;
}