我的評論
re: Java Stream Xiaobo Sun 2008-12-16 09:52
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
String s;
while (bufferedReader.read() != -1) {
System.out.println("input something:");
s = bufferedReader.readLine();
System.out.println("input is: " + s);
}
}
======================================
java io 有兩種類型的讀寫方法。
一種是以字節(jié)為單位讀寫的,InputStream、OutputStream(interface) 下面有很多類像FileInputStream、PipedInputStream 等皆繼承了上述接口。
另外一種就是你上面提到的以unicode為單位進行讀寫的方法。 表現(xiàn)為 Reader、Writer、接口,像BufferedReader 就繼承了Reader接口。
BufferedReader ****===> 在讀取的時候,會先開辟一個緩沖區(qū),把這些數(shù)據(jù)讀到緩沖區(qū),等到滿了以后,就直接拿出來。
至于InputStreamReader,****===> An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters according to a specified character encoding.通過這個類可以把這兩種方式讀取出來的信息相互切換。
system.in ****===> 這是控制臺輸入信息時讀入的管道。她繼承PrintStream ,而PrintStream 類 繼承了FilterOutputStream 類。這個類實現(xiàn)了OutputStream 接口。
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(System.in));
String s;
while (bufferedReader.read() != -1) {
System.out.println("input something:");
s = bufferedReader.readLine();
System.out.println("input is: " + s);
}
}
======================================
java io 有兩種類型的讀寫方法。
一種是以字節(jié)為單位讀寫的,InputStream、OutputStream(interface) 下面有很多類像FileInputStream、PipedInputStream 等皆繼承了上述接口。
另外一種就是你上面提到的以unicode為單位進行讀寫的方法。 表現(xiàn)為 Reader、Writer、接口,像BufferedReader 就繼承了Reader接口。
BufferedReader ****===> 在讀取的時候,會先開辟一個緩沖區(qū),把這些數(shù)據(jù)讀到緩沖區(qū),等到滿了以后,就直接拿出來。
至于InputStreamReader,****===> An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and translates them into characters according to a specified character encoding.通過這個類可以把這兩種方式讀取出來的信息相互切換。
system.in ****===> 這是控制臺輸入信息時讀入的管道。她繼承PrintStream ,而PrintStream 類 繼承了FilterOutputStream 類。這個類實現(xiàn)了OutputStream 接口。
re: Linux 啟動 Xiaobo Sun 2008-12-10 20:32
啟動服務
安裝完成后,vsftpd是作為一個獨立的服務啟動,不接受xinetd的管理。系統(tǒng)會自動在Service列表中添加名稱vsftpd的服務。啟動服務的步驟如下:
1、Yast→System→System Services(Run level);
2、在服務列表中選擇vsftpd,點擊下方的Enable按鈕,啟動服務,F(xiàn)inish。
注意,在啟動vsftpd時可能會不能啟動,有時是因為它所依賴的服務沒有啟動,如syslog,這時選中syslog,點擊Enable按鈕。如果還是不能啟動,可以重新啟動xinetd服務,然后再啟動vsftpd服務。
安裝完成后,vsftpd是作為一個獨立的服務啟動,不接受xinetd的管理。系統(tǒng)會自動在Service列表中添加名稱vsftpd的服務。啟動服務的步驟如下:
1、Yast→System→System Services(Run level);
2、在服務列表中選擇vsftpd,點擊下方的Enable按鈕,啟動服務,F(xiàn)inish。
注意,在啟動vsftpd時可能會不能啟動,有時是因為它所依賴的服務沒有啟動,如syslog,這時選中syslog,點擊Enable按鈕。如果還是不能啟動,可以重新啟動xinetd服務,然后再啟動vsftpd服務。
re: pkg-config學習 Xiaobo Sun 2008-10-15 12:15
CC = gcc
all:
$(CC) `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
all:
$(CC) `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
re: Makefile example Xiaobo Sun 2008-10-09 15:08
如果你要傳遞變量到下級Makefile中,那么你可以使用這樣的聲明:
export <variable ...>;
export variable := value
其等價于:
variable := value
export variable
export variable += value
其等價于:
variable += value
export variable
export <variable ...>;
export variable := value
其等價于:
variable := value
export variable
export variable += value
其等價于:
variable += value
export variable
re: Makefile example Xiaobo Sun 2008-10-09 14:07
看一個例子:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的
目標,也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模
式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴目標
就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動化變量,“$<”表示所有的依賴
目標集(也就是“foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.o”)。于是,
上面的規(guī)則展開后等價于下面的規(guī)則:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態(tài)模式規(guī)則”就
可以寫完一堆規(guī)則,實在是太有效率了
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
上面的例子中,指明了我們的目標從$object中獲取,“%.o”表明要所有以“.o”結尾的
目標,也就是“foo.o bar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模
式“%.o”的“%”,也就是“foo bar”,并為其加下“.c”的后綴,于是,我們的依賴目標
就是“foo.c bar.c”。而命令中的“$<”和“$@”則是自動化變量,“$<”表示所有的依賴
目標集(也就是“foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.o”)。于是,
上面的規(guī)則展開后等價于下面的規(guī)則:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
$(CC) -c $(CFLAGS) bar.c -o bar.o
試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態(tài)模式規(guī)則”就
可以寫完一堆規(guī)則,實在是太有效率了
re: Makefile example Xiaobo Sun 2008-10-09 13:57
# macro
GSOAPPATH=../../
CCINCLUDE= -I$(GSOAPPATH)
#CCINCLUDE+= -I$(RESPONSEPATH)
CCFLAGS= -Wall -g
OBJECTS= soapServiceRequestIFSOAPService.o soapC.o stdsoap2.o \
soapServiceResponseIFSOAPProxy.o
# targets
all : server++ client++
server++ : server.cpp $(OBJECTS)
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
client++ : client.cpp soapC.o stdsoap2.o soapServiceResponseIFSOAPProxy.o
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
soapServiceRequestIFSOAPService.o : soapServiceRequestIFSOAPService.cpp
g++ -c $(CCINCLUDE) $^
soapC.o : soapC.cpp
g++ -c $(CCINCLUDE) $^
stdsoap2.o : $(GSOAPPATH)stdsoap2.cpp
g++ -c $(CCINCLUDE) $^
soapServiceResponseIFSOAPProxy.o : soapServiceResponseIFSOAPProxy.cpp
g++ -c $(CCINCLUDE) $^
clean :
rm -f server++ client++ *.o *~ *.swp
.PHONY : all clean
GSOAPPATH=../../
CCINCLUDE= -I$(GSOAPPATH)
#CCINCLUDE+= -I$(RESPONSEPATH)
CCFLAGS= -Wall -g
OBJECTS= soapServiceRequestIFSOAPService.o soapC.o stdsoap2.o \
soapServiceResponseIFSOAPProxy.o
# targets
all : server++ client++
server++ : server.cpp $(OBJECTS)
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
client++ : client.cpp soapC.o stdsoap2.o soapServiceResponseIFSOAPProxy.o
g++ $(CCFLAGS) $(CCINCLUDE) $^ -o $@
soapServiceRequestIFSOAPService.o : soapServiceRequestIFSOAPService.cpp
g++ -c $(CCINCLUDE) $^
soapC.o : soapC.cpp
g++ -c $(CCINCLUDE) $^
stdsoap2.o : $(GSOAPPATH)stdsoap2.cpp
g++ -c $(CCINCLUDE) $^
soapServiceResponseIFSOAPProxy.o : soapServiceResponseIFSOAPProxy.cpp
g++ -c $(CCINCLUDE) $^
clean :
rm -f server++ client++ *.o *~ *.swp
.PHONY : all clean
re: TCP: SYN ACK FIN RST PSH URG Xiaobo Sun 2008-10-09 12:38
其實在握手和結束時確認號應該是對方序列號加1,傳輸數(shù)據(jù)時則是對方序列號加上對方攜帶應用層數(shù)據(jù)的長度.如果從以太網(wǎng)包返回來計算所加的長度,就嫌走彎路了.
另外,如果對方?jīng)]有數(shù)據(jù)過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層數(shù)據(jù)發(fā)送長度.
另外,如果對方?jīng)]有數(shù)據(jù)過來,則自己的確認號不變,序列號為上次的序列號加上本次應用層數(shù)據(jù)發(fā)送長度.
re: TCP: SYN ACK FIN RST PSH URG Xiaobo Sun 2008-10-09 12:35
握手階段:
序號 方向 seq ack
1 A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解釋:
1:A向B發(fā)起連接請求,以一個隨機數(shù)初始化A的seq,這里假設為10000,此時ACK=0
2:B收到A的連接請求后,也以一個隨機數(shù)初始化B的seq,這里假設為20000,意思是:你的請求我已收到,我這方的數(shù)據(jù)流就從這個數(shù)開始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回復后,它的seq是它的上個請求的seq加1,即10000+1=10001,意思也是:你的回復我收到了,我這方的數(shù)據(jù)流就從這個數(shù)開始。A此時的ACK是B的seq加1,即20000+1=20001
數(shù)據(jù)傳輸階段:
序號 方向 seq ack size
23 A->B 40000 70000 1514
24 B->A 70000 40000+1514-54=41460 54
25 A->B 41460 70000+54-54=70000 1514
26 B->A 70000 41460+1514-54=42920 54
解釋:
23:B接收到A發(fā)來的seq=40000,ack=70000,size=1514的數(shù)據(jù)包
24:于是B向A也發(fā)一個數(shù)據(jù)包,告訴B,你的上個包我收到了。B的seq就以它收到的數(shù)據(jù)包的ACK填充,ACK是它收到的數(shù)據(jù)包的SEQ加上數(shù)據(jù)包的大小(不包括以太網(wǎng)協(xié)議頭,IP頭,TCP頭),以證實B發(fā)過來的數(shù)據(jù)全收到了。
25:A在收到B發(fā)過來的ack為41460的數(shù)據(jù)包時,一看到41460,正好是它的上個數(shù)據(jù)包的seq加上包的大小,就明白,上次發(fā)送的數(shù)據(jù)包已安全到達。于是它再發(fā)一個數(shù)據(jù)包給B。這個正在發(fā)送的數(shù)據(jù)包的seq也以它收到的數(shù)據(jù)包的ACK填充,ACK就以它收到的數(shù)據(jù)包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數(shù)據(jù)項)。
26:一樣的啊
序號 方向 seq ack
1 A->B 10000 0
2 B->A 20000 10000+1=10001
3 A->B 10001 20000+1=20001
解釋:
1:A向B發(fā)起連接請求,以一個隨機數(shù)初始化A的seq,這里假設為10000,此時ACK=0
2:B收到A的連接請求后,也以一個隨機數(shù)初始化B的seq,這里假設為20000,意思是:你的請求我已收到,我這方的數(shù)據(jù)流就從這個數(shù)開始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回復后,它的seq是它的上個請求的seq加1,即10000+1=10001,意思也是:你的回復我收到了,我這方的數(shù)據(jù)流就從這個數(shù)開始。A此時的ACK是B的seq加1,即20000+1=20001
數(shù)據(jù)傳輸階段:
序號 方向 seq ack size
23 A->B 40000 70000 1514
24 B->A 70000 40000+1514-54=41460 54
25 A->B 41460 70000+54-54=70000 1514
26 B->A 70000 41460+1514-54=42920 54
解釋:
23:B接收到A發(fā)來的seq=40000,ack=70000,size=1514的數(shù)據(jù)包
24:于是B向A也發(fā)一個數(shù)據(jù)包,告訴B,你的上個包我收到了。B的seq就以它收到的數(shù)據(jù)包的ACK填充,ACK是它收到的數(shù)據(jù)包的SEQ加上數(shù)據(jù)包的大小(不包括以太網(wǎng)協(xié)議頭,IP頭,TCP頭),以證實B發(fā)過來的數(shù)據(jù)全收到了。
25:A在收到B發(fā)過來的ack為41460的數(shù)據(jù)包時,一看到41460,正好是它的上個數(shù)據(jù)包的seq加上包的大小,就明白,上次發(fā)送的數(shù)據(jù)包已安全到達。于是它再發(fā)一個數(shù)據(jù)包給B。這個正在發(fā)送的數(shù)據(jù)包的seq也以它收到的數(shù)據(jù)包的ACK填充,ACK就以它收到的數(shù)據(jù)包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數(shù)據(jù)項)。
26:一樣的啊
re: # ps -aux |grep sysprocess Xiaobo Sun 2008-07-28 11:09
ps a 顯示現(xiàn)行終端機下的所有程序,包括其他用戶的程序。
2)ps -A 顯示所有程序。
3)ps c 列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數(shù)或常駐服務的標示。
4)ps -e 此參數(shù)的效果和指定"A"參數(shù)相同。
5)ps e 列出程序時,顯示每個程序所使用的環(huán)境變量。
6)ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關系。
7)ps -H 顯示樹狀結構,表示程序間的相互關系。
8)ps -N 顯示所有的程序,除了執(zhí)行ps指令終端機下的程序之外。
9)ps s 采用程序信號的格式顯示程序狀況。
10)ps S 列出程序時,包括已中斷的子程序資料。
11)ps -t 指定終端機編號,并列出屬于該終端機的程序的狀況。
12)ps u 以用戶為主的格式來顯示程序狀況。
13)ps x 顯示所有程序,不以終端機來區(qū)分。
最常用的方法是ps -aux,然后再利用一個管道符號導向到grep去查找特定的進程,然后再對特定的進程進行操作。
2)ps -A 顯示所有程序。
3)ps c 列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數(shù)或常駐服務的標示。
4)ps -e 此參數(shù)的效果和指定"A"參數(shù)相同。
5)ps e 列出程序時,顯示每個程序所使用的環(huán)境變量。
6)ps f 用ASCII字符顯示樹狀結構,表達程序間的相互關系。
7)ps -H 顯示樹狀結構,表示程序間的相互關系。
8)ps -N 顯示所有的程序,除了執(zhí)行ps指令終端機下的程序之外。
9)ps s 采用程序信號的格式顯示程序狀況。
10)ps S 列出程序時,包括已中斷的子程序資料。
11)ps -t 指定終端機編號,并列出屬于該終端機的程序的狀況。
12)ps u 以用戶為主的格式來顯示程序狀況。
13)ps x 顯示所有程序,不以終端機來區(qū)分。
最常用的方法是ps -aux,然后再利用一個管道符號導向到grep去查找特定的進程,然后再對特定的進程進行操作。