2009年10月27日 星期二

CMake簡單範例

CMake是一個軟體建構工具,可以幫我們產生MakeFile。以下就用簡單的範例來呈現:
我們有三個檔案main.cpp hello.cpp hello.h和三個CMakeLists.txt
分別位於

|-- CMakeLists.txt
|-- lib
| |-- CMakeLists.txt
| |-- hello.cpp
| |-- hello.h
|-- src
|-- CMakeLists.txt
|-- main.cpp

hello.h
void hello();
hello.cpp
#include "hello.h"
#include <iostream>
void hello() {
std::cout << "Hello CMake!" << std::endl;
}

main.cpp
#include "hello.h"
int main() {
hello();
return 0;
}

最上層的CMakeLists.txt
PROJECT (HELLO)
# 加入兩個子資料夾(src後面bin的意思是將src的輸出放到bin資料夾)
ADD_SUBDIRECTORY (src bin)
ADD_SUBDIRECTORY (lib)

lib/CMakeLists.txt
# 將hello.cpp編譯成static library
ADD_LIBRARY (HelloLibrary hello.cpp)

src/CMakeLists.txt
INCLUDE_DIRECTORIES (${HELLO_SOURCE_DIR}/lib)
SET (HELLO_SRCS main.cpp)
ADD_EXECUTABLE (HelloCMake HELLO_SRCS)
TARGET_LINK_LIBRARIES (HelloCMake HelloLibrary)

在執行cmake前,我們可以在最上層先建立一個目錄(例如:build),然後到build目錄下執行cmake,如此cmake後產生的資料皆會在build資料夾裡。
# mkdir build
# cd build
# cmake ../
# make

若順利的話,便可在bin找到HelloCMake執行檔,在lib可找到libHelloLibrary.a

2009年10月24日 星期六

FastCGI

FastCGI是一個網頁伺服器端應用程式介面,CGI有一個很大的缺點就是CGI程式每次執行就會產生一個新的process,當同時很多人上線時,會對伺服器造成很大負擔;而FastCGI程式是常駐型的CGI程式,不會因為Http_Request結束而終止。

在Debian 5安裝Apache2 + FastCGI
# apt-get install apache2 libapache2-mod-fastcgi
# /etc/init.d/apache2 restart

接著用c寫一個helloFCGI的程式來驗証:
#include "fcgi_stdio.h"
#include <stdlib.h>

int main()
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n"
"\r\n"
"<title>Hello FastCGI</title>"
"<h1>Hello FastCGI</h1>"
"Request number %d running on host <i>%s</i>\n",
++count, getenv("SERVER_NAME"));
}
return 0;
}

編譯時要加上-lfcgi參數
# gcc -lfcgi -o helloFCGI.fcgi helloFCGI.c

將helloFCGI.fcgi放到所設定的FastCGI執行的資料夾內(Debian安裝好的預設資料夾在/usr/lib/cgi-bin),在網頁執行http://localhost/cgi-bin/helloFCGI.fcgi即可看到結果。

2009年10月7日 星期三

Windows Multithreaded Programming

要建立多執行緒程式,我們會用到<process.h>標頭檔定義的函式:

uintptr_t _beginthread(

void( __cdecl *start_address )( void * ),
unsigned stack_size,
void *arglist

);

_beginthread()需要三個參數,第一個是要執行緒所執行的函式名稱(注意這個函式的prototype);第二個參數為給這個執行緒的stack size,若設定0值則作業系統會自動設定此值;第三個參數可以用來傳遞資料給欲執行的函式。

#include <windows.h>
#include <process.h>
#include <iostream>

using namespace std;

void func1(void *);
void func2(void *);

int main()
{
_beginthread(func1, 0, NULL);
_beginthread(func2, 0, NULL);

Sleep(10000);
cout << "Main exit" << endl;
getchar();
return 0;
}

void func1(void *p)
{
for(int i = 1; i < 6; ++i)
cout << "func1 value " << i << endl;
}

void func2(void *p)
{
for(int i = 1; i < 6; ++i)
cout << "func2 value " << i << endl;
}

以下用簡單的範例說明:
執行結果如下:


這個結果可以發現兩個執行緒可以在任何時間點去插隊執行,若要避免這種情況發生,我們可以利用critical section來解決它。