[英]“sequenced before” and “Every evaluation in the calling function” in c++
[英]calling openlog before every syslog C++
我創建了自己的C庫,我的同事打算使用它。 在這個包裝器中,我打算使用syslog
並且根據輸入參數,我希望在LOCAL0
和LOCAL1
之間切換。
我發現最簡單的方法是使用LOCAL0
或LOCAL1
執行openlog()
,具體取決於輸入參數,然后執行syslog()
和`closelog()。
我在相同的包裝器API中有所有3個(類似於下面的內容):
void syslog_wrap_api(int flag, const char *msg)
{
setlogmask(LOG_UPTO (LOG_INFO));
if(flag == 0)
openlog("myapplog",LOG_NDELAY,LOG_LOCAL0);
else
openlog("myapplog",LOG_NDELAY,LOG_LOCAL1);
syslog(LOG_INFO,"%s",msg);
closelog()
}
我的問題是,這個API能否在壓力下出現問題(性能問題)?
在我看來,這是錯誤的方法,但文檔令人困惑。
您是否在壓力下遇到問題將由您的C庫中openlog
的實施決定。 這可能是個問題。 更重要的是,在多線程環境中,一個線程可能在另一個線程發出openlog
之后發出syslog
,這意味着使用了錯誤的優先級。
如何正確執行此操作的關鍵在於手冊頁:
如果在后續對
syslog()
調用中未指定,則facility參數將建立一個默認值。 選項和設施的值如下所示......priority
參數是通過對facility
進行OR運算和level
值(下面解釋)形成的。
關於如何利用這個的線索在這里:
openlog()
的使用是可選的; 如果需要,它將由syslog()
自動調用,在這種情況下,ident
將默認為NULL
。
如果你不使用openlog
,必須有表達的某些方面facility
。 答案是,你可以指定基金作為零openlog
(或不使用它的話),並且還是在設施的priority
的參數syslog
。
所以,像:
syslog(LOG_INFO | (flag?LOG_LOCAL1:LOG_LOCAL0),"%s",msg);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.