[英]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.