用 nm 觀察 .so 的 Symbol Table
nm -gC MyLib.so
- -g : 只列出 external symbol
- -C : 將 C++ 的 symbol 轉換成易讀的版本
nm -gC MyLib.so
#include <unistd.h>這是一個簡單的設定Timer介面。當呼叫了alarm( n )後,等待n秒後,就會觸發一次的SIGALRM的signal,所以必須要在呼叫alarm前,先設好SIGALRM的handler function才行。而當乎呼alarm(0)時,則表示停止當前的timer處理,不要發出SIGALRM的signal。
unsigned int alarm(unsigned int seconds);
#include <iostream>
#include <unistd.h>
#include <signal.h>
using namespace std;
void my_alarm_handler(int a)
{
cerr<<"my_alarm_handler"<<endl;
alarm(2);//重新設定
}
int main()
{
signal( SIGALRM, my_alarm_handler );
alarm(1);
while(1){}
return 0;
}
#include <sys/time.h>setitimer與getitimer提供了三種類別的Timer使用:
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 2
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value,
struct itimerval *ovalue);
struct itimerval {
struct timeval it_interval; /* next value : 下一次觸發所需的時間*/
struct timeval it_value; /* current value : 目前距離觸發時間點 剩餘的時間*/
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};#include <iostream>
#include <sys/time.h>
#include <signal.h>
using namespace std;
void my_alarm_handler(int a)
{
cerr<<"test "<<endl;
}
int main(){
struct itimerval t;
t.it_interval.tv_usec = 0;
t.it_interval.tv_sec = 2;
t.it_value.tv_usec = 0;
t.it_value.tv_sec = 1;
if( setitimer( ITIMER_REAL, &t, NULL) < 0 ){
cerr<<"settimer error."<<endl;
return -1;
}
signal( SIGALRM, my_alarm_handler );
while(1){
sleep(2);
}
return 0;
}
find -type f -exec iconv --verbose -f BIG-5 -t UTF-8 {} -o {}.result \; \
-exec mv {} {}.bak \; \
-exec mv {}.result {} \;test
tttt
eeee
ssss
tttt
% cat source.txt | tr 'test' 'ABCD'注意到這個結果,tr只是單純的將test <=> ABCD做個對應,並將文件內容轉換為
DBCD
DDDD
BBBB
CCCC
DDDD
% cat source.txt | sed s/test/abcd/g說明:
% sed s/test/abcd/g source.txt
abcd
tttt
eeee
ssss
tttt
export SED=sed
重新命名的指令:mv
其實在Linux底下沒有特別處理rename的直接指令,不過可以透過mv這個指令,得到rename的效果。mv原本是用來處理「移動檔案」到不同的目錄底下,因此可以透過mv將原檔案移至原目錄底下新的檔名,就是rename的效果。
Ex: 將a.out改名稱為b.out
% mv a.out b.out
新增檔案的指令:touch
Ex: 新增檔案a.txt
% touch a.txt
touch原本的意義是將檔案的建立時間更新至目前的時間,因為常常會有檔案的時間不一致,導致一些問題。比如Makefile更改時間跑到了未來,導致執行make時,會出現一些Warnning,可以透過touch Makefile來避免這個Warnning出現
MySQL++是一套提供C++程式可以對MySQL的Database做存取的Library。雖然MySQL原本就有提供mysql.h供人使用,但我認為MySQL++對學習C++的人而言,語法非常的簡易好用,整個用法感覺上跟PHP很像,如果學過PHP & C++的人,應該很快就能上手了~
MySQL++的相關網站:
‧首頁
‧Documentation
‧Simple Example
MySQL++執行環境:
‧GCC 3.x and 4.x on recent x86 Linuxes,
‧GCC 4.x from Xcode 2.x on Mac OS X 10.4
‧Visual C++ 2005 on 32-bit Windows.
而我的安裝環境是Linux的Ubuntu以下就針對Ubuntu的用者說明安裝過程
安裝MySQL++ in Ubuntu:
% sudo apt-get install libmysql++-dev
% sudo apt-get install mysql-client-5.0
很簡單吧....不知不覺的,安裝結束了 XD,記得重開機一下,這樣等等compile程式時才抓得到library
Compile程式所需要相關MySQL++的參數:
% g++ [code-file-name] -I/usr/include/mysql++ -I/usr/include/mysql \
-lmysqlpp -lmysqlclient
MySQL++的基本類別(class)說明:
這些類別都是在mysqlpp的namespace底下,如果要使用的話,必須在程式開始就宣告using namespace mysqlpp,或是在程式中每個類別前都加上mysqlpp::Connection、mysqlpp::Query、等等。
以下有個我參考官網附的Example修改的code,加上一點中文註解,希望有興趣的人可以更快學會MySQL++
#include <mysql++.h>
#include <iostream>
//這樣子之後的code裡的Connection, Query, Result, Row...
// 前面就不用加mysqlpp::
using namespace mysqlpp;
using namespace std;
int main(int argc, char *argv[])
{
/*** 連結到input輸入的argument的DB ***/
// Input argument format
// ./a.out <DB-Name> <DB-Host-IP> <Name> <Password>
Connection con(false);
if ( !con.connect( argv[1], argv[2], argv[3], argv[4] ) ){
cerr<<"connect DB error..."<<endl;
return -1;
}
/*** 從DB撈資料出來 ***/
Query query = con.query();// create一個Query
// 可以對con做讀取or寫入
query << "SELECT item FROM mydb";//輸入要query的command
Result res = query.store();//執行query,並把結果存至Result res
/*** 秀出所有的result set ***/
cout << "We have : " << endl;
if (res) {//如果res有抓到東西的話....
Row row;//row可儲存每一列的資料
Row::size_type i;
for (i = 0; row = res.at(i); ++i) {
cout << 't' << row.at(0) << endl;
}
}
else {
//秀出Query產生的Error
cerr << "Failed to get item list: "
<< query.error() << endl;
return -1;
}
return 0;
}
今天看網頁怪怪的,很慢才出現,所以想說重新啟動Apache看看,可能會好一點,結果竟然出現錯誤,著實嚇了我一大跳...
% /etc/init.d/apache2 restart
(13)Permission denied: make_sock: could not bind to address [::]:80
後來才發現,原來是忘了用sudo了....Orz...要有root的權限才能啟用or關閉apache,發現原因後,覺得還滿白痴的=_="""
% sudo /etc/init.d/apache2 restart
由於本站之前在windows上執行,有時候會造成Apache莫名奇妙地失靈,所以才想將server移至Linux Ubuntu上執行。這樣子所吃的資源可能也會比較少一點。
以下紀錄了移機的過程,主要遇到的問題有...編碼以及轉簡潔網址的問題。
[事前準備工作]
[重建Database]
[建置Lifetype網站]
[使用簡潔網址]
sudo a2enmod rewrite
因為有個程式有需求,要暫時把segmentation fault的signal SIGSEGV這個訊號忽略掉,比較利於之後程式的debug。原本想說用single();這個function指定發生SIGSEGV時交給指定的handler function去處理,就可以忽略掉。結果…「代誌並不是憨人所想得呷呢簡單」,執行之後的結果,卻是系統不斷地發出SIGSEGV這個signal…停都停不下來,擋都擋不住...連ctrl+c都不行Orz...
原來在fault發生後,必須處理造成fault的原因,再返回程式執行,返回程式後,會重新執行faulting instruction。所以若是想忽略segmentation fault的話,就必須透過longjmp()跳過可能發生錯誤的code,然後再繼續執行。
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/ipc.h>
#include <setjmp.h>
jmp_buf setjmp_buffer;
void segmentFault(){
std::err<<"get a segment Fault!"<<std::endl;
longjmp( setjmp_buffer, 1 );//用0的話, setjmp()就會收到0,那麼可能會無窮回圈
}
int main(){
//當發出SIGSEGV這個signal時,交給segmentFault這個function處理
signal( SIGSEGV,(sig_t)segmentFault );
if( setjmp( setjmp_buffer ) == 0 )
{
// do something
std::cout<<"longjmp!!n";
char *a= NULL;
std::cout<<"ok"<<std::endl;
a[0] = '1';//cause a Segmentation Fault
}
else
{
// do something
std::cout<<"after longjmp.n";
}
return 0;
}
## 此篇文章有更新 ##
## 以下為手動compile安裝xslt+php的步驟 ##
## 至於Ubuntu+php5+xsl 請參考我的新文章 ##
由於在php4.1以後的版本對extension xslt預設不再是support,因此如果想要為php安裝xslt的話,就變得有點麻煩了。最近正好要在Fedora5上安裝Apache+PHP+XSLT+Mysql,原本一切很順利得裝起來了,但是最後才發現PHP5不support XSLT了,原本全都用yum指令安裝的,或是用rpm安裝的,全都要移除重新安裝一次…
在Linux上,由於要讓PHP5裝上XSLT,就必須要自行下載source code經過compile後才能安裝,而要compile安裝PHP的話,也必須compile安裝Apache才行。
安裝XSLT所需要的套件是Sablot,而Sablot又需要先安裝Expat,所以安裝的順序為(以下版本為參考用):
以下為我的安裝指令,--prefix的路徑是可以自己設的,以自己的主機設定為主。
這只是在Linux上,安裝Apache+PHP再加上PHP的extension的XSLT,如果要加上其他的extension也是差不多依樣畫胡蘆就行了。若還是不太清楚,可以下./configure --help查一查,或是看看INSTALL檔案的內容,應該就滿清楚的了。
我之前已經安裝好了PHP5, Apache2, MySQL了,現在就缺phpMyAdmin來管理我的DB~
在Ubuntu上安裝上面那三個套件都很簡單
都用apt-get install就可以輕鬆安裝成功了~
原本以為用apt-get install phpmyadmin就可以了
結果Ubuntu竟然不能這樣直接安裝...Q_Q
所以只能自己做苦力囉~
首先,先至phpMyAdmindownload最新的phpMyAdmin的版本,我是下載all-languages-utf-8-only.tar.gz這個版本
% wget [URL]
% tar -xvzf [file name]
% mv [director name] /var/www/
% sudo cp config.sample.inc.php config.inc.php
然後再修改config.inc.php裡面的內容~
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
將cookie改成http,可以增加安全性
#include<termios.h>
char getch(){
int i;//判斷是否有read到值
char ch;
struct termios _old, _new;
tcgetattr (0, &_old);
memcpy (&_new, &_old, sizeof (struct termios));
_new.c_lflag &= ~(ICANON | ECHO);
tcsetattr (0, TCSANOW, &_new);
i = read (0, &ch, 1);
tcsetattr (0, TCSANOW, &_old);
if (i == 1)/* ch is the character to use */
return ch;
else/* there was some problem; complain, return error, whatever */
printf("error!n");;
return 0;
}