簡體   English   中英

需要在linux中編寫守護程序,不確定使用C ++還是C

[英]Need to write a daemon in linux, not sure what to use C++ or C

我在選擇正確的語言編寫守護程序時遇到了一個小問題,我對C和C ++感到困惑,我想使用C ++,因為它比C擴展得多,但是我想使用C,因為它是所有內容的起點linux,

我想去C ++,因為我有很多資源,所以,如果我選擇C ++而不是C,會有所不同嗎?

如果我學習更多的C語言,將會有什么好處? 我覺得如果我進入C ++,我將在C ++中介紹C。

問候

立即使用您最了解的語言。

既不使用C也不使用C ++,一般編程實際上並不需要它們。

使用使事情變得容易的高級語言,例如Python

當然,這取決於您要編寫哪種類型的“守護程序”,但是很可能您希望將開發工作集中在手頭的任務上,而不是解決諸如內存泄漏,字符串處理或其他干擾等問題。 不使用C或(在較小程度上)使用C ++都可以做到這一點。

就我而言,C ++是帶有可選附加功能的C。 因此,繼續使用,並使用您覺得合適的點點滴滴。

如果您更喜歡C ++,則沒有理由選擇C而不是C ++,反之亦然。 它們都是同等能力的語言,可以完成此任務。

除非您希望對C更滿意,否則請使用您所知道的。

我可以用代碼完全回答這個問題。 編寫守護程序大致包括以下步驟:

/*
 * 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 privs),然后“守護進程”。 否則很難調試守護進程。

編輯:當然,使用函數指針是C的思維方式,但是沒有理由不能實現某種形式的基於類的機制。

因此,說實話,這真的沒有關系。 選擇您喜歡的任何一個。

除非您打算進行內核開發或嵌入式編程,否則學習C ++絕對比學習C更好。您需要注意的唯一事情是C ++會“混用”其函數名稱,以使C ++中的函數void foo()將無法通過C程序直接訪問。 訣竅是使用C鏈接聲明它,如extern "C" void foo()

也就是說,C ++是比C大得多的語言,並且肯定會花更多的時間來學習。

您絕對應該使用C ++。

您絕對應該使用C,句點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM