2013年10月25日 星期五

Qt Project
./qt-linux-opensource-5.1.1-x86-offline.run 
# sudo apt-get update
# sudo apt-get install g++
因為ubuntu沒有g++的compiler

How to get the GL library/headers?

Linux:
sudo apt-get update
OpenGL: sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev
引用於http://stackoverflow.com/questions/3933027/how-to-get-the-gl-library-headers

2013年10月17日 星期四

如何使用 select(), FD_SET(), FD_CLR(), FD_ISSET(), FD_ZERO()

在Linux裡面已經有很多的C Library等著我們叫用
今天的主題就是要看 Linux 對事件的監控

首先  先來觀察一下這幾個程式的prototype

SYNOPSIS

#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
FD_SET(int fd, fd_set *fdset);
FD_CLR(int fd, fd_set *fdset);
FD_ISSET(int fd, fd_set *fdset);
FD_ZERO(fd_set *fdset);



下班之後再補齊好了= =

Reference:  http://www.mkssoftware.com/docs/man3/select.3.asp

2013年10月12日 星期六

socket教學與範例

Linux作業系統使用socket觀念來設計網路程式,在使用TCP和UDP網路程式之前,必須先了解socket基本觀念。
socket 是一種可做雙向資料傳輸的通道,Linux程序可經由此裝置與本地端或是遠端的程序做溝通。
Linux socket分成unix-domain socket和internet-domain socket二種。unix-domain socket又稱為local socket,主要用來與本地端的程序溝通。internet-domain socket用來與遠地端的程序溝通。

引用於http://www.vr.ncue.edu.tw/esa/EmbeddedSystemProgramming2010/ch07.htm

snprint用法

在 C 語言裡,要建立一個字元陣列的字串,常常會使用 sprintf() 這個函數來做格式化的處理。但是實際上,這個函式卻不是那麼「安全」。怎麼說呢?sprintf() 的整個介面長的樣子的是:
int sprintf ( char * str, const char * format, ... )
也就是在使用前,必須要先建立好一個字元陣列的空間,再用這個函式把內容填入,下面就是簡單的例子:
int tmp = 10;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
在這個例子裡,cstr 最後的值,會是「10 * 10 = 100」,看起來好像很好?但是如果把 tmp 的值改成 10000 的話,cstr 則應該要變成「10000 * 10000 = 100000000」,但是由於這時候的字串所需長度為 26,而要寫入的 cstr的長度只有 20,所以就會造成 buffer overflow 的問題。
像如果是以 Visual C++ 2005 來編譯的話,如果程式裡有用到 sprintf(),他在編譯時就會顯示一個警告訊息:
warning C4996: 'sprintf': This function or variable may be unsafe. Consider 
using sprintf_s instead.
而要怎麼避免 sprintf 的 buffer overflow 的問題呢?除了微軟建議的 sprintf_s() 外,實際上在 C99 裡, 也多了一個 snprinf() 是用來取代現有的 sprintf() 了~他的介面是:
int snprintf(char *str, size_t size, const char * restrict format, ...)
應該可以明顯看得出來,snprinf() 這個函式比 sprinf() 多了一個參數 size;這個參數的用處,就是用來限制最大的寫入資料量,可以用來避免 buffer overflow。以上面的例子來說,本來寫:
int tmp = 10000;
char cstr[20];
sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );
的話,會產生 buffer overflow 的問題。而如果改成用 snprinf() 的話,就是變成:
int tmp = 10000;
char cstr[20];
snprintf( cstr, sizeof( cstr ), "%d * %d = %d", tmp, tmp, tmp * tmp );
這樣一來,snprinf() 在把資料寫到 cstr 時,最多就只會寫入 20 個字元(cstr 的長度),而不會有 buffer overflow 的問題了~

argc與argv

常見的為主程式 main() 有兩個引數 argc 與 argv [1],即函數 main 標題的定義為


main( int argc, char *argv[] )
其作用是 執行該檔 及 所相隨的 option。
如果將一程式 file.c 編譯完之後, 產生一 執行檔 file.exe。 當執行 file.exe 如
c:> file option1 option2 option3
則執行 file.exe 時, argc 的值為 4, argv 則 含 4 個字串,即
argv[0]="file"、 argv[1]="option1"、 argv[2]="option2"、 argv[3]="option3"。
如此一來 程式的設計, 可以有 較多的彈性。

【說明】[4]:
1、argc 與 argv為C語言的關鍵字,是專門用在命令列的參數名。
2、argc是argument count(參數總和)的縮寫,代表包括指令本身的參數個數。系統會自動計算所輸入的參數個數。
3、argv則是argument value的縮寫。代表參數值。也就是使用者在命令列中輸入的字串,每個字串以空白相隔。同時,系統會自動將程式本身的名稱指定給argv[0],再將程式名稱後面所接續的參數依序指定給argv[1]、argv[2]….。

試試看這個例子[3]:
#include ;
int main(int argc, char *argv[])
{
printf("%d\n",argc);
while(argc)
printf("%s\n",argv[--argc]);
return 0;
}
假設將其編譯為test.exe,
在命令行下,
test hello
得到的輸出結果為:
2
hello
test

ubuntu NFS設定

1. nfs server的安裝與設置
(1) 安裝nfs server
  1. sudo apt-get install nfs-kernel-server nfs-common
(2) 重啟nfs server
  1. sudo service nfs-kernel-server restart
(3) 設置nfs分享目錄
  1. sudo gedit /etc/exports
  2. /home/deng/socket  *(rw,no_root_squash,sync)
修改完成後,重啟nfs server即可(方法(2))。

2. nfs client安裝與配置
(1) 安裝nfs client
  1. sudo apt-get install nfs-common
(2) 查看nfs server上共享的目錄
  1. showmount -e 192.168.xx.xx
(3) 建立共享的資料夾,再執行掛載
  1. mkdir socket
  2. mount -t nfs 192.168.xx.xx:/home/deng/socket /home/deng/socket
(4) 修改/etc/fstab
192.168.xx.xx:/home/deng/socket nfs defaults 0 0


引用於:http://blog.chinaunix.net/uid-20940095-id-3401874.html
安裝VMware workstation 7之後,到ubuntu官網下載ubuntu-12.04.3-desktop-i386.iso,開始安裝時,發生錯誤如下:


後來使用64位元版本,和fedora的版本,都無法安裝。

解決方法:

將VMware workstation 7 解除安裝,安裝最新版的VMware workstation 10即可安裝ubuntu的系統。


電腦:ACER Aspire V3 471G
顯卡:NVIDIA GeForce GT 630M
RAM:8G
系統:windows 8 Profession 64bit