воскресенье, 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;
}

вторник, 12 июля 2011 г.

Life


Говорят, всё гениальное - просто. Сегодня я в этом убедился.

В поисках разминки для мозгов я бороздил просторы интернета, и набрёл на невзрачный снимок экрана на сайте http://screenshots.debian.net:
Я слышал о "Жизни" и раньше, даже видел работающие примеры этой игры, но не полагал, что вся её суть кроется всего лишь в паре утверждений.

пятница, 10 июня 2011 г.

Terminal


В книге "Современные операционные системы" Эндрю Таненбаум несколько раз говорит о том, что развитие компьютерной индустрии проходит по спирали: позабытые казалось бы технологии переживают своё рождение несколько раз на различных типах устройств, либо с течением времени обретают актуальность.

На раннем этапе развития компьютеров к ним подключались терминалы. Порой это были довольно большие устройства, предоставляющие сразу все устройства ввода-вывода для машины. С терминалом работал оператор. К тому времени разделение инжинеров и программистов уже произошло — человеку не нужно было больше глубоко разбираться в физике и технике, чтобы работать на компьютере.

Теперь к нашим временам. Office 365, Chromebook, Cloud Computing... Все эти новшества позволяют нам вобще не задумываться как и что работает, а сразу получать готовые, работающие машины. Нам даже не нужно администрировать систему, следить за ней (в случае с Chromebook). По сути компьютеры становятся лишь придатком, позволяющим нам подключаться к великой Паутине и жить там. Мозг и центр переносится на мощные серверы, которые обеспечивают нас всем необходимым, выдавая готовый результат вычислений и/или виртуализаций. Домашние компьютеры же становятся не чем иным как удаленным терминалом, набором устройств для ввода информации и получения в каком-либо виде её вывода.

От программистов теперь и окончательно отпочковались пользователи, порой совершенно не интересующиеся внутренностями своей машины или операционной системы. Есть результат, а какой магией он достигается совсем не важно. Со временем пользователи, видимо, станут только ещё тупее, погружаясь в пучину социальных сетей, глубоко пронизывающих всю жизнь. Мы постепенно проектируем Матрицу, не считаете? Что самое странное (впрочем, в фильме было подобное же) — люди сами охотно в неё ныряют. Жутко. Однако дети Эйнштейна были, есть, и будут. Это не может не радовать. Давайте не будем забывать о нашем интересе. В путь! Ковыряться в недрах системы, писать что-то своё, разбираться как это всё работает.

Правда?