Нужно написать демон в Linux, не уверен, что использовать C ++ или C - PullRequest
1 голос
/ 11 января 2011

У меня небольшая проблема с выбором правильного языка для написания моего демона, я запутался в C и C ++, я хочу использовать C ++, потому что он более расширен, чем C, но я хочу использовать C, потому что это отправная точкавсего в linux,

Я хочу пойти на C ++, так как у меня много ресурсов по этому поводу, поэтому, имеет ли значение, если я выберу C ++ вместо C?

и что я будухорошо, если я узнаю больше C?Я чувствую, что если я войду в C ++, я расскажу о C в C ++ ...

С уважением

Ответы [ 8 ]

4 голосов
/ 11 января 2011

Используйте любой язык, который вы знаете лучше всего.

3 голосов
/ 12 января 2011

Не используйте ни C, ни C ++, они не требуются для общего программирования.

Используйте язык высокого уровня, который упрощает задачу, такой как Python

Конечно, это зависит от того, какого типа «демона» вы пишете, но, по всей вероятности, вы хотите сосредоточить свои усилия на разработке на выполняемой задаче, а не исправлять такие вещи, как утечки памяти, обработка строк или другие отвлекающие факторы. Использование ни C, ни (в меньшей степени) C ++ не позволит вам сделать это.

2 голосов
/ 11 января 2011

Я могу ответить на этот вопрос полностью в коде. Написание демона примерно состоит из следующих действий:

/*
 * Daemon Initialisation:
 * 1. Fork()
 * 2. setsid()
 * 3. Fork() do we need to do this twice?
 * 4. Chdir /
 * 5. Umask(0)
 * 6. Close STDIN/OUT/ERR
 * 7. Optionally re-open stuff.
 *
 * Refs:
 * 1. http://www.faqs.org/faqs/unix-faq/programmer/faq/
 * 2. http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
 * 3. http://www.enderunix.org/docs/eng/daemon.php
 */

/* Variables */
/* Our process ID and Session ID */

pid_t pid, sid;
int fd = 0;

/* Fork off the parent process */
pid = fork();
if (pid < 0)
{
    exit(EXIT_FAILURE);
}
/* If we got a good PID, then
 * we can exit the parent process.
 */
if (pid > 0)
{
    exit(EXIT_SUCCESS);
}

/* Create a new SID for the child process */
sid = setsid();

if (sid < 0)
{
    /* Log the failure */
    exit(EXIT_FAILURE);
}

/* Fork off the parent process, again */
pid = fork();
if (pid < 0)
{
    exit(EXIT_FAILURE);
}
/* If we got a good PID, then
   we can exit the parent process. */
if (pid > 0)
{
    exit(EXIT_SUCCESS);
}

/* Change the current working directory */
if ((chdir("/")) < 0)
{
    /* Log the failure */
    exit(EXIT_FAILURE);
}

/* Change the file mode mask */
umask(0);

/* Close all file descriptors */

for (fd = getdtablesize(); fd >= 0; --fd)
{
    close(fd);
}

/* Open standard file descriptors from
 * elsewhere.
 * e.g. /dev/null -> stdin.
 *      /dev/console -> stderr?
 *      logfile as stdout?
 */
fd = open("/dev/null", O_RDWR); /* open stdin */
dup(fd); /* stdout */
dup(fd); /* stderr */

Это все вызовы функций C, но, конечно, вы можете вызывать их из C ++.

Причина, по которой я сидел в этом коде, заключается в том, что на самом деле это функция, которую я передаю указателям на функции, которые выполняют мое "тело демона". Почему я делаю это так? Чтобы выяснить, где мои ошибки запускают код непосредственно как процесс (если необходимо с привилегиями root), я "демонизирую". В противном случае довольно сложно отлаживать процесс демона ...

Edit: конечно, использование указателей на функции - это образ мышления на языке C, но нет никаких причин, по которым вы не можете реализовать какую-либо форму механизма на основе классов.

Так что, если честно, это действительно не имеет значения. Выберите то, что вы предпочитаете.

2 голосов
/ 11 января 2011

Нет причин выбирать C вместо C ++, если вам удобнее работать с C ++, и наоборот. Они оба одинаково способны языки для этой задачи.

Если вы не хотите чувствовать себя более комфортно с C, просто используйте то, что знаете.

2 голосов
/ 11 января 2011

, насколько я понимаю, C ++ - это C с необязательными дополнениями.Так что продолжайте в том же духе и используйте все, что вам удобно.

1 голос
/ 11 января 2011

Вы обязательно должны использовать C, точка.

1 голос
/ 11 января 2011

Вы обязательно должны использовать C ++.

1 голос
/ 11 января 2011

Если вы не планируете заниматься разработкой ядра или встроенным программированием, изучение C ++ строго лучше, чем изучение C. Единственное, о чем вам следует помнить, это то, что C ++ "искажает" имена своих функций, так что ваша функция void foo() в C ++ не будет доступен напрямую из C-программы. Хитрость заключается в том, чтобы объявить это с помощью связи C, как в extern "C" void foo().

Тем не менее, C ++ является гораздо большим языком, чем C, и, безусловно, для его изучения потребуется больше времени.

...