1. 程式人生 > >Linux之C語言中如何丟擲異常或將異常寫入日誌檔案中

Linux之C語言中如何丟擲異常或將異常寫入日誌檔案中

Linux中用C語言寫系統日誌

__________________________________________________________________________________________________

Author:冀博

Time :2011/11/24

Emaile:[email protected]

宣告:本人不反對別人和團體轉載本人文章,但請註明出處,3Q。對本文有任何疑問,可直接在

部落格中留言或發Emaile和我聯絡(不保證及時回覆,時間有限,敬請原諒)

_________________________________________________________________________________________________

我門在做一些大型專案時候,在編寫程式中時會考慮到,如果出現一些異常的時候是直接丟擲異常呢,還是將異常寫入到日誌檔案中,提供給系統管理員來檢視。以下就針對這兩種情況分別介紹在Linux中如何將異常寫入日誌或者是直接丟擲異常。

一.丟擲異常

在C語言中丟擲異常,是用的最多,也是最簡單的。因為我們先來talk下它的使用方法。

1.使用exit()函式來實現丟擲異常

1>標頭檔案:#include<stdlib.h>

2>當在程式中碰到異常情況時,可以使用exit(),函式直接退出程式,即丟擲異常。

3>exit()函式的引數為EXIT_FAILURE,用來表明程式執行失敗。

4>例項:當我們在Linux中當開一個檔案失敗時,使用exit()函式丟擲異常。

#include<stdio.h>

#include<stdlib.h>
#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

int main()

{

    int fd;

    fd  = open(“tiger.c”,O_RDWR);

if( fd < 0){

       perror(“OpenFailed\n”);

       exit(EXIT_FAILURE);

}

}

執行可執行程式後,如下圖所示:


二.將異常寫入日誌檔案

有些時候,我們要將除錯資訊寫入到日誌檔案中去以便系統管理員去檢視;而不是直接退出程式。

1.使用syslog(),openlog(),closelog()函式將除錯資訊寫入日誌檔案中

1>這三個函式openlog, syslog, closelog是一套系統日誌寫入介面,另外那個vsyslog和syslog功能一樣,只是引數格式不同。

2> 通常,syslog守護程序讀取三種格式的記錄訊息。此守護程序在啟動時讀一個配置檔案。一般來說,其檔名為/etc/syslog.conf,該檔案決定了不同種類的訊息應送向何處。例如,緊急訊息可被送向系統管理員(若已登入),並在控制檯上顯示,而警告訊息則可記錄到一個檔案中。該機制提供了syslog函式,其呼叫格式如下 
#include <syslog.h> 
void openlog (char*ident,int option ,int facility); 
void syslog(int priority,char*format,……) 
void closelog();

3>呼叫openlog是可選擇的。如果不呼叫openlog,則在第一次呼叫syslog時,自動呼叫openlog。呼叫closelog也是可選擇的,它只是關閉被用於與syslog守護程序通訊的描述符。呼叫openlog 使我們可以指定一個ident,以後, 此ident 將被加至每則記錄訊息中。ident 一般是程式的名稱 。4>openlog及closelog函式說明
此函式原型如下:
void openlog(const char *ident, int option, int facility);
此函式用來開啟一個到系統日誌記錄程式的連線,開啟之後就可以用syslog或vsyslog函式向系統日誌裡新增資訊了。而closelog函式就是用來關閉此連線的。

第一個引數ident將是一個標記,ident所表示的字串將固定地加在每行日誌的前面以標識這個日誌,通常就寫成當前程式的名稱以作標記。

第二個引數option是下列值取與運算的結果:LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID,各值意義請參考man openlog手冊:

l LOG_CONS:Write directly to system console if there is an error while sendingto system logger.

l LOG_NDELAY:Open the connection immediately (normally, the connection is openedwhen the first message is logged).

l LOG_NOWAIT:Don’t  wait  for  child processes that may have beencreated while logging the message.  (The GNU C library does not create a childprocess, so this option has no effect on Linux.)

l LOG_ODELAY: The converse of LOG_NDELAY; opening of the connection is delayeduntil syslog() is called.  (This is the  default,  and  neednot be specified.)

l LOG_PERROR:(Not in SUSv3.)Print to stderr as well.

l LOG_PID:Include PID with eachmessage.

第三個引數指明記錄日誌的程式的型別。

5>syslog函式及引數
syslog函式用於把日誌訊息發給系統程式syslogd去記錄,此函式原型是:void syslog(int priority, const char *format, ...);
第一個引數是訊息的緊急級別,第二個引數是訊息的格式,之後是格式對應的引數。就是printf函式一樣使用。

如果我們的程式要使用系統日誌功能,只需要在程式啟動時使用openlog函式來連線syslogd程式,後面隨時用syslog函式寫日誌就行了。

2.程式例項:


執行程式後,終端執行沒有什麼反應,但是要用:

tail /var/log/syslog可以檢視系統日誌資訊



相關推薦

LinuxC語言如何異常異常寫入日誌檔案

Linux中用C語言寫系統日誌__________________________________________________________________________________________________Author:冀博Time :2011/11/24

嵌入式LInuxC語言提升篇---Skr Skr Up Up

任務 開發者 三目運算 關鍵字const 此外 mat 庫函數 linu 限制 嵌入式C語言提升 致敬:每一個奮鬥的人! Up Up UpC語言常見編譯錯誤1.預處理錯誤 -E 1-1 找不到源文件錯誤 自己定義頭文件 使用 “xxx.

Java下資料寫入CSV檔案

import java.io.*; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.uti

web伺服器日誌檔案的IP地址轉換為主機名

需求:將log檔案中的ip地址轉換為主機名 日誌檔案的格式如下: 10.100.122.132 - [17/Jun/2013:22:53:58] "GET /bgs/greenbg.gif HTTP 1.1" 200 50 10.100.122.133 - [17/Jun

loadrunner 學習六:結果寫入日誌檔案

學習六:將結果寫入日誌檔案 1.指令碼實現 首先根據網上找到的內容跟著進行指令碼實現,程式碼如下: //定義要寫入的日誌,開啟檔案 char *filename = "d:\\lr_script\\test001.log"; long file_st

讀取application.yml/application.properties的引數(讀取自定義配置檔案的引數)

使用springboot搭建專案的話,如果程式碼裡需要讀取配置檔案資訊,動態生成資料該怎麼辦呢,其實可以直接寫到springboot配置檔案當中,自己定義標籤來讀取。 application.yml與application.properties有什麼不同呢? (1)yml檔案用縮排代替pro

資料寫入CSV檔案

在測試過程中需要將一些資料寫入CSV檔案中以在另一些Thread Group中使用, 所以Google了一個使用BeanShell的寫入CSV檔案的方法, 這個方法可以放在BeanShell post process, BeanShell Assertion裡面都可以, 在在

python logging模組程式碼示例:實現日誌輸出到控制檯, 並且寫入日誌檔案

import logging class Logger(object): def __init__(self, log_file_name, log_level, logger_name):

在資料庫批量執行SQL並結果記錄到檔案

         專案中有一個步驟:資料移植。資料移植要遷移很多的表,遷移完之後我們要看一下我們遷移的表的記錄數對不對。假如說有一百多張表,不可能每次都一張表一張表的去查詢然後記錄,這時候就得有一個指令碼可以自動執行。我在資料視覺化工具上怎麼試都不行,同時執行一百多個查詢語

C++建構函式異常

建構函式中丟擲異常會有怎樣的影響呢?如下實驗程式碼 #include <iostream> #include <stdexcept> using namespace std; class A { public: A(int n){} ~A(){cout

C++建構函式異常

建構函式中丟擲的異常   1、標準C++中定義建構函式是一個物件構建自己,分配所需資源的地 方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程(解構函式的執行)。可誰能保證物件的構造 過程一定能成功呢?說不定系統當前的某

java異常練習題:定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類定義一個方法,在方法異常,在主方法觀察結果

題目描述: 定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。  定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類定義一個方法,在方法異常,在主方法觀察結果。

1).定義一個MulException類繼承Exception類,要求兩數相乘等於100報錯,在主類中定義一個方法,在方法中丟擲此異常,在主方法觀察結果。 2).定義一個DivException類繼承RuntimeException類,要求兩數相除等於2報錯,在主類中定義一個方法,在方法中丟

在eclipse部署專案web有時候訪問jsp會以下類似的異常資訊

如果在eclipse中部署專案web有時候訪問jsp會丟擲以下類似的異常資訊 : org.apache.jasper.JasperException:The absolute uri: [http://java.sun.com/jsp](http://java.sun.com

自定義的異常異常處理異常

你可以用raise語句來引發一個異常。異常/錯誤物件必須有一個名字,且它們應是Error或Exception類的子類 下面是一個引發異常的例子: class ShortInputException(Exception): ‘’‘自定義的異常類’’’ def init(self, le

_092_Java_finally使用return會吃掉catch異常

轉自,感謝作者的無私分享。 如果在finally中使用return會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 如果在finally中使用throw會吃掉catch中丟擲的異常,也會吃掉try或者catch中的return。 看例子:

不要在解構函式異常

轉載 : http://www.cnblogs.com/hbt19860104/archive/2012/10/22/2734006.html (很好的博文,贊!!!。解惑瞭如何處理析構函數出現異常現象,增加對解構函式的工作機制和作用域的相關理解。) 不要在解構函式中丟擲異常 1: 可以

27.能否在建構函式異常?解構函式呢?

首先,我們要明確一點!一個函式執行的過程中,如果丟擲異常,會導致函式提前終止! 在C++建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況發生。因為在建構函式中丟擲異常,在概念上將被視為該物件沒有被成功構造,因此當前物件的解構函式就不會被呼叫。同時

Fork/Join框架(五)在任務異常

宣告:本文是《 Java 7 Concurrency Cookbook 》的第五章,作者: Javier Fernández González     譯者:許巧輝 校對:方騰飛 在任務中丟擲異常 在Java中有兩種異常: 已檢查異常(Checked exceptions):這些異常必須在一

spring事務控制的方法異常不回滾

最近做專案時,由於業務需要,在service中丟擲自定義異常時出現了事務不回滾的情況,具體情況如下: public void editEpidemic(Epidemic epidemic) throws EpidemicException{