2015年7月31日 星期五

Fedora 14 YUM 失效問題

每一版的 Linux 都具有所謂的支援年限,除非是 LTS 的版本,支援的年限才會比較長。

最近剛灌 Fedora 14,和許多舊版的 Linux 一樣都會遇到超過支援年限的問題,像這種超過年限的 YUM 或 APT,其實一般來說 repo 都會死掉或是移到其他地方去,所以在這邊要說明 Fedora 14 透過下列步驟的修改,應該也能夠維持 YUM 的 repo (P.S. 其他的版本可以參考下列網址看版本內容還在不在 http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/)


  1. 修改 /etc/yum.repos.d/fedora.repo 和 /etc/yum.repos.d/fedora-updates.repo
    將 mirrorlist 全部註解掉 (前面加上 # ),應該會有 6 個
  2. 修改 /etc/yum.repos.d/fedora.repo 和 /etc/yum.repos.d/fedora-updates.repo
    將 baseurl 前面的註解去掉 (前面去掉 # ),應該會有 6 個
    之後將 baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/ 修改為 baseurl=http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/$releasever/Everything/$basearch/
    $ 的部分,代表變數,指的是你現在 OS 的版本與架構,一樣應該也會有六個要改
    這邊一樣要注意一下,雖然有六個要改,其實 $basearch 後面各自會接不同的東西,例如 os debug SRPMS 等等,但這不是重點,你應該有發現其實就只是改上面紅色字體的部分而已)
  3. 執行 sudo yum update
P.S. 有時候不見得是原來 repo 死掉,而是自己的網路沒有通,為了避免烏龍,可以先 ping 看看 google 或其他之類的網站 (IP 和 DNS 要記得設定)

這是如果網路不通,或 repo 死掉時,執行 sudo yum install XXX 以及 sudo yum update 會出現的錯誤訊息
Error: Cannot retrieve repository metadata (repomd.xml) for repository: fedora. Please verify its path and try again

2015年7月30日 星期四

htop 編譯錯誤

1. htop 在執行 autogen.sh 時,出現
./autogen.sh: 3: ./autogen.sh: aclocal: not found
./autogen.sh: 4: ./autogen.sh: autoconf: not found
./autogen.sh: 5: ./autogen.sh: autoheader: not found
./autogen.sh: 6: ./autogen.sh: libtoolize: not found
./autogen.sh: 7: ./autogen.sh: automake: not found
解決辦法:
sudo apt-get install automake autoconf libtool

2. htop 在 configure 時出現
configure: error: missing libraries:  libncurses
解決辦法:
sudo apt-get install libncurses5-dev libncursesw5

3. htop 在 configure 時出現
configure: error: You may want to use --disable-unicode or install libncursesw.
解決辦法:
sudo apt-get install libncursesw5-dev libncursesw5
然後再重新 configure 一次

2015年7月5日 星期日

Simple pthread example on Linux

想要在 Linux 下練習 multi-thread 程式,可以從這個簡單的範例開始,首先可以先參考幾個 pthread API. 

pthread_create 是你第一個要用的 pthread API,下列是我們的範例程式
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

/*
 * 在 thread_1 裡面執行一個無窮迴圈,並不斷印出 thread_1 訊息
 * 為了避免不斷的 loop,我們用 sleep function 在每次迴圈停 1 秒
 */
void *thread_1(void *argv) {
 while(1) {
  sleep(1);
  printf("I am thread_1\n");
 }
}

/*
 * 基本上和 thread_2 相同,但時間停留 2 秒
 */
void *thread_2(void *argv) {
 while (1) {
  sleep(2);
  printf("I am thread_2\n");
 }
}

int main() {
 pthread_t t1, t2; // 先宣告兩個 pthread 的變數

 // 之後開始建立並執行這兩個 thread,這兩個 thread 分別執行上面 thread_1, thread_2 這兩個 function
 pthread_create(&t1, NULL, &thread_1, NULL);
 pthread_create(&t2, NULL, &thread_2, NULL);

 // 而我們自己的 main thread 也同樣執行無窮迴圈,每次停留三秒
 while (1) {
  sleep(3);
  printf("I am main thread\n");
 }

 return 0;
}

結果在這邊
> ./pthread-example 
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_1
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_2
I am thread_1
I am thread_1
I am thread_2
I am thread_1
I am main thread
I am thread_1
I am thread_2
I am thread_1

我們可以注意到,在撰寫 multi-thread 程式時,需要改變以往 Sequential 的思維,實際上在 multi-thread 的觀念中,所有的 thread 都是同時在執行的 (實際上可能不是啦,但我們在比較高階的角度來看,就當作是同時在進行)。
另外,可以發現雖然 thread_1 停一秒,thread_2 停兩秒,main thread 停三秒,但實際在印出來時還是有先後順序之分,而且每一次都不太固定,這也是 thread 有時候比較抽象的地方。

最後,main thread 是不能停止的,這也是為什麼我們要在 main function 也插入無窮迴圈,因為 main thread 如果直接 return 停止,連帶的會把 thread_1 和 thread_2 一起停止。


thread_create manual: http://man7.org/linux/man-pages/man3/pthread_create.3.html
source code on github: https://github.com/jackzzjack/blogger.git

可以下載 source code 並直接執行 make simple,則會編譯出 pthread-example,之後直接 ./pthread-example 直行即可。

2015年7月2日 星期四

Signals on Linux

Linux 存在有 Signal 的機制,當我們在執行某支 Process 時,可以利用 Signal 對特定正在執行的 Process 給予特定的訊息。

事實上,當我們執行 Process 時,按下 Ctrl-C、Ctrl-Z 等等,其實也算是另外一種對 Process 送出 Signal 的動作,例如在 Linux 裡 Ctrl-Z 是送出 SIGTSTP 的 Signal,預設是將 Process 進行暫停的動作,而 Ctrl-C 則是送出 SIGINT 的 Signal,其意義是鍵盤對 Process 送出 Interrupt 的動作,預設是停止目前前景的 Process。

在 Signal manual 有更詳細所有的 Signal 介紹

另外,在處裡關於 Signal 的部分,預設在 Linux 都具有原本預設的處理方法,但其實我們是可以 Overwrite 改成我們想要的處理方式。

C API
http://man7.org/linux/man-pages/man2/signal.2.html

首先需要引入 signal.h 這個 header file,然後建立一個 signal handler 帶有 signal number 的參數,最後在 main function 利用 signal function 掛上 signal handler,一旦 process 發生了你所指定的 signal,便會導到你自己的 handler。


#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);


P.S. 如果想要改成原來預設 Linux 的 Default Handler,可以將 handler 改成 SIG_DFL,如果要忽略這一個 Signal,則可以改成 SIG_IGN。

其中 SIGKILL 和 SIGSTOP 是不能被更改和捕抓的,意思就是你不能 Overwrite,就算 Overwrite 了,他也不會理你。