查看 Ubuntu 版本資訊的 6 種方法

本篇 ShengYu 介紹如何查詢 Ubuntu 版本資訊,查看 Ubuntu 版本資訊大概分為以下 6 種方法,Ubuntu 版本號碼、Ubuntu 代號名稱以及 kernel 版本都能查詢得到,

  • 使用 lsb_release -a 查詢 Ubuntu 版本資訊
  • 使用 cat /etc/lsb-release 查詢 Ubuntu 版本資訊
  • 使用 cat /etc/os-release 查詢 Ubuntu 版本資訊
  • 使用 hostnamectl 查詢 Ubuntu 版本資訊
  • 使用 uname -a 查詢 Ubuntu 版本資訊
  • 使用 cat /etc/issue 查詢 Ubuntu 版本資訊

使用 lsb_release -a 查詢 Ubuntu 版本資訊

想要查看 Ubuntu 版本資訊可以使用 lsb_release -a 來查詢 ,這方法建議優先使用,結果如下,Description 就是 Ubuntu 版本說明資訊,Release 就是 Ubuntu 版本號碼,Codename 就是 Ubuntu 代號名稱,

1
2
3
4
5
6
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.5 LTS
Release: 16.04
Codename: xenial

想要直接查看 Ubuntu Description 版本說明資訊可以使用 lsb_release -d 來查詢,

1
2
$ lsb_release -d
Description: Ubuntu 16.04.5 LTS

想要直接查看 Ubuntu Release 版本號碼可以使用 lsb_release -r 來查詢,

1
2
$ lsb_release -r
Release: 16.04

配合 awk 的話就可以取出版本號碼,

1
2
$ lsb_release -r | awk '{print $2}'
16.04

想要直接查看 Ubuntu Codename 代號名稱可以使用 lsb_release -c 來查詢,

1
2
$ lsb_release -c
Codename: xenial

配合 awk 的話就可以取出代號名稱,

1
2
$ lsb_release -c | awk '{print $2}'
xenial

使用 cat /etc/lsb-release 查詢 Ubuntu 版本資訊

使用 cat /etc/lsb-release 指令查詢 Ubuntu 版本資訊,跟前一個指令類似,結果如下,

1
2
3
4
5
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"

使用 cat /etc/os-release 查詢 Ubuntu 版本資訊

另外一種方法是用 cat /etc/os-release 查看 Ubuntu 版本資訊,結果如下,

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

使用 hostnamectl 查詢 Ubuntu 版本資訊

hostnamectl 是用來設定主機名稱的指令,也可以用 hostnamectl 來查看 Ubuntu 版本資訊,

1
2
3
4
5
6
7
8
9
$ hostnamectl
Static hostname: PC
Icon name: computer-desktop
Chassis: desktop
Machine ID: 06a7f1877a044e31b752b472b081fdf3
Boot ID: d274984715b34844a88503ca3332a8a7
Operating System: Ubuntu 16.04.5 LTS
Kernel: Linux 4.10.0-40-generic
Architecture: x86-64

使用 uname -a 查詢 Ubuntu 版本資訊

使用 uname -a 指令查詢 Ubuntu 版本資訊,這個指令是可以看到 kernel 版本,結果如下,

1
2
$ uname -a
Linux shengyu 4.10.0-40-generic #44~16.04.1-Ubuntu SMP Thu Nov 9 15:37:44 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

使用 cat /etc/issue 查詢 Ubuntu 版本資訊

最後一種查看 Ubuntu 版本資訊的方法是使用 cat /etc/issue 來查詢,結果如下,

1
2
$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l

以上就是 查看 Ubuntu 版本資訊的 6 種方法介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支援一下!

C/C++ sleep 用法與範例

本篇 ShengYu 介紹 Windows/Linux/Unix 平台 C/C++ sleep 函式用法與範例,sleep 就是讓程式暫停執行一段時間,各平台的 sleep 函式名稱與使用方法不盡相同,將會在本篇一一說明,

在 Windows 平台的 Sleep (毫秒)

在 Windows 平台的 Sleep() 的時間單位是毫秒(ms / millisecond),所以要延遲1秒的話就是1000毫秒,寫法如下,

1
2
3
#include <windows.h>
// ...
Sleep(1000); // 1s

在 Linux/Unix 平台的 sleep (秒)

在 Linux / Unix 平台的 sleep() 的時間單位是秒(s / second),寫法如下,

1
2
3
#include <unistd.h>
// ...
sleep(1); // 1s

在 Linux/Unix 平台的 usleep (微秒)

承上例,那麼在 Linux / Unix 平台下想要 sleep 的時間單位是秒級以下呢?
Linux / Unix 平台下有個 usleep() 函式,usleep 的時間單位是微秒(us / microsecond),寫法如下,

1
2
3
#include <unistd.h>
// ...
usleep(1000*1000); // 1s

另外 Linux/Unix 平台還有 nanosleep() 函式,時間單位為納秒 (ns / nanosecond),關於這部分下次我再寫一篇給大家講解,

C++11 的 sleep_for

跨平台開發的話以 C++11 所提供的 sleep_for 最為方便,現今編譯器已普遍支援,寫法如下,提供了各種時間單位,

1
2
3
4
5
6
7
8
9
10
#include <thread>
#include <chrono>
// ...
std::this_thread::sleep_for(std::chrono::seconds(1)); // 1s
// or
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // 1s
// or
std::this_thread::sleep_for(std::chrono::microseconds(1000*1000)); // 1s
// or
std::this_thread::sleep_for(std::chrono::nanoseconds(1000*1000*1000)); // 1s

其它相關文章推薦
C/C++ 新手入門教學懶人包
std::this_thread::sleep_for 用法與範例

Python PIL Image 轉換成 OpenCV 影像格式

本篇 ShengYu 介紹 Python PIL Image 轉換成 OpenCV 影像格式的方法。

PIL.Image 轉換 OpenCV 影像格式

opencv 採用的影像排列方式為 BGR,而 PIL 採用的影像排列方式為 RGB,所以這邊要將 PIL image 轉為 opencv 影像格式的話,就需要將影像排列方式從 RGB 轉成 BGR,先用 numpy.asarray() 將 PIL 轉成 numpy.ndarray 格式,再使用的是 opencv 的 cv2.cvtColor() 函式,使用方式如下所示,

pil-image-to-opencv-image.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image
import cv2
import numpy

img = Image.open("lena.jpg")
img.show()

img2 = cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
cv2.imshow('opencv image', img2)
cv2.waitKey(0)

其它相關文章:Python OpenCV 影像格式轉換成 PIL Image

Excel 取出文字左邊開始到第n的字元的文字

本篇 ShengYu 介紹 Excel 取出儲存格文字左邊開始到第n的字元的文字,

LEFT 函式:取出儲存格文字左邊開始到第n的字元的文字

例如 A2 欄位的文字是 100 xxxxx,那我們就用 LEFT 函式來處理,

1
2
=LEFT(A2, 3) # 取出A2儲存格從左邊開始到第1個的字元的文字
100

另外補充
如果是要右邊開始可以使用 RIGHT 函式,
如果是要中間開始可以使用 Mid 函式,

其它參考
擷取文字的方法 @ 騷客。眼迷離。 :: 痞客邦 ::
https://zoeyiszoey.pixnet.net/blog/post/132030949
抓字串 Left, Mid, Right函數 · 11 Excel Classes_New
https://mrcooper.gitbooks.io/11-excel-classes_new/content/chapter4.html

Linux sendmail 寄信指令用法與範例

本篇 ShengYu 要介紹 Linux sendmail 寄信指令的用法與範例,

假如你有個例行工作,需要每天寄信到你自己的信箱的話,就可以使用 sendmail 這個指令,用法很簡單,將收件人(mailTo),寄件人(mailFrom),主旨(mailSubject)分別填好,接著填信件內容,最後再裡用 sendmail 這個指令將你的郵件寄出,就完成囉!

ubuntu 下如果沒有這個指令的話,可以透過 apt 來安裝

1
sudo apt install sendmail

你也可以將它寫成 shell script,這樣要修改時就很方便,再配合 crontab 排程就很好用囉!

mail.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh

mailTo='xxx@xxx.com'
mailFrom='my pc'
mailSubject='Daily Info'

html=`cat <<- _EOF_
<html>
<head>
<title>Title</title>
</head>
<body>
hello, this is daily info mail ....
</body>
</html>
_EOF_`
#echo ${html}

echo ${html} | formail -I "From: ${mailFrom}" \
-I "MIME-Version:1.0" \
-I "Content-type:text/html;charset=UTF-8" \
-I "Subject: ${mailSubject}" | sendmail -oi ${mailTo}

透過以上的方法可以將一些定時的任務信件寄到自己的信箱,例如 gmail 等等,是很方便的功能唷!

C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 pthread_setaffinity_np

本篇 ShengYu 介紹 C/C++ Linux/Unix 執行緒設定 CPU 的方法 pthread_setaffinity_np()

主執行緒設定 CPU

主執行緒要設定跑在哪顆 CPU 的話,可以直接在 main 裡的主執行緒使用 pthread_setaffinity_np() 設定即可,pthread_setaffinity_np() 的第一個參數為 pthread_t,
以我的電腦來說是單 CPU 4 核心,所以有 CPU0~CPU3 可以選擇,這邊示範選擇跑在 CPU3,

cpp-pthread_setaffinity_np.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// g++ cpp-pthread_setaffinity_np.cpp -o a.out -pthread
#include <stdio.h>
#include <sched.h> // for sched_getcpu()
#include <pthread.h>

int main() {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("pthread_setaffinity_np cpu%d\n", cpu_id);
pthread_t th = pthread_self();
pthread_setaffinity_np(th, sizeof(cpuset), &cpuset);

printf("sched_getcpu = %d\n", sched_getcpu());

return 0;
}

也可以使用 sched_setaffinity() 來設定 main 主執行緒跑在哪個 CPU。

在 pthread 執行緒設定 CPU

pthread 建立出來的執行緒要設定 CPU 的話,方式如下,
對於 pthread 建立執行緒不熟悉的話可以看我之前的這篇介紹

cpp-pthread_setaffinity_np2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// g++ cpp-pthread_setaffinity_np2.cpp -o a.out -pthread
#include <stdio.h>
#include <iostream>
#include <sched.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;

void * foo(void *arg) {
printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
usleep(1);
printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
return NULL;
}

int main() {
pthread_t t1;
if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
}

int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("pthread_setaffinity_np cpu%d\n", cpu_id);
pthread_setaffinity_np(t1, sizeof(cpuset), &cpuset);

//printf("main thread sched_getcpu = %d\n", sched_getcpu());

pthread_join(t1, NULL);

return 0;
}

輸出結果如下,可以發現 foo() 函式裡可能需要加個延遲,以便讓 pthread_setaffinity_np() 的設定生效,

1
2
3
pthread_setaffinity_np cpu3
t1 thread sched_getcpu = 1
t1 thread sched_getcpu = 3

上述方法也許有點不完美,也可以在 foo() 函式裡執行 pthread_setaffinity_np() 就可免去延遲的程式碼。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// g++ cpp-pthread_setaffinity_np3.cpp -o a.out -pthread
#include <stdio.h>
#include <iostream>
#include <sched.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;

void * foo(void *arg) {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("pthread_setaffinity_np cpu%d\n", cpu_id);
pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);

printf("t1 thread sched_getcpu = %d\n", sched_getcpu());

return NULL;
}

int main() {
pthread_t t1;
if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
}

//printf("main thread sched_getcpu = %d\n", sched_getcpu());

pthread_join(t1, NULL);

return 0;
}

輸出結果如下,

1
2
pthread_setaffinity_np cpu3
t1 thread sched_getcpu = 3

在 C++ std::thread 執行緒設定 CPU

要在 C++ std::thread 設定跑在哪顆 CPU 的話可以用 thread::native_handle() 取得 pthread_t 再傳入 pthread_setaffinity_np() 的第一個參數,因為 t1 thread 是 std::thread 建構時就開始執行了,所以下面 pthread_setaffinity_np() 設定太慢的話,就會比較慢生效,所以有可能 foo 執行到一半時才被設定 CPU,因此這邊先加個延遲 1 microseconds,確保一開始執行時就被設定 CPU,

cpp-pthread_setaffinity_np-std-thread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// g++ cpp-pthread_setaffinity_np-std-thread.cpp -o a.out -std=c++11 -pthread
#include <iostream>
#include <thread>
#include <chrono>
#include <sched.h>
#include <pthread.h>
using namespace std;

void foo() {
std::this_thread::sleep_for(std::chrono::microseconds(1));

printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
}

int main() {
thread t1(foo);

int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("pthread_setaffinity_np cpu%d\n", cpu_id);
pthread_setaffinity_np(t1.native_handle(), sizeof(cpuset), &cpuset);

//printf("main thread sched_getcpu = %d\n", sched_getcpu());

if (t1.joinable()) {
t1.join();
}

return 0;
}

上述方法也許有點不完美,也可以改成在執行 thread 的函式裡去設定自身 thread 的跑在哪顆 CPU,這樣可以省去延遲的程式碼,

cpp-pthread_setaffinity_np-std-thread2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-pthread_setaffinity_np-std-thread2.cpp -o a.out -std=c++11 -pthread
#include <iostream>
#include <thread>
#include <sched.h>
#include <pthread.h>
using namespace std;

void foo() {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("pthread_setaffinity_np cpu%d\n", cpu_id);
pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);

printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
}

int main() {
thread t1(foo);

//printf("main thread sched_getcpu = %d\n", sched_getcpu());

if (t1.joinable()) {
t1.join();
}

return 0;
}

其它參考
c++ - Set CPU affinity when create a thread - Stack Overflow
https://stackoverflow.com/questions/24645880/set-cpu-affinity-when-create-a-thread
pthread_setaffinity_np(3) - Linux manual page
https://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html
C++11 threads, affinity and hyperthreading - Eli Bendersky’s website
https://eli.thegreenplace.net/2016/c11-threads-affinity-and-hyperthreading/
SetThreadAffinityMask function (winbase.h) - Win32 apps | Microsoft Docs
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 sched_setaffinity
C/C++ Linux/Unix pthread 建立多執行緒用法與範例
C++ std::thread 建立多執行緒用法與範例

Python OpenCV 影像格式轉換成 PIL Image

本篇 ShengYu 介紹 Python OpenCV 影像格式轉換成 PIL Image 的方法。

OpenCV 轉換 PIL.Image 影像格式

PIL image 採用的影像排列方式為 RGB,而 opencv 採用的影像排列方式為 BGR,所以這邊要將 opencv 轉為 PIL image 影像格式的話,就需要將影像排列方式從 BGR 轉成 RGB,使用的是 PIL 的 cv2.cvtColor() 函式,之後再用 Image.fromarray() 轉成 PIL 的格式,使用方式如下所示,

opencv-image-to-pil-image.py
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
from PIL import Image

img = cv2.imread('lena.jpg')
cv2.imshow('opencv image', img)

img2 = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
img2.show()

cv2.waitKey(0)

其它相關文章:Python PIL Image 轉換成 OpenCV 影像格式

Ubuntu 清空垃圾桶指令

本篇 ShengYu 介紹 Ubuntu 如何用指令清空垃圾桶?

一般我們圖形化介面的清空垃圾桶大家都知道,但今天如果要在命令列下要輸入指令來清空垃圾桶的話,有兩種方式

  • 方法1. 清空 ~/.local/share/Trash/files/
  • 方法2. 使用 trash-empty 指令清空垃圾桶

方法1. 清空 ~/.local/share/Trash/files/

清空 ~/.local/share/Trash/files/ 的指令如下

1
2
$ cd ~/.local/share/Trash/files/
$ rm -rf *

或者是

1
$ rm -rf ~/.local/share/Trash/files/*

方法2. 使用 trash-empty 指令清空垃圾桶

使用 trash-empty 指令來清空垃圾桶是很簡單輕鬆的,較新的 Ubuntu 預設沒安裝,所以會需要先安裝這個指令,安裝指令如下,

1
$ sudo apt install trash-cli

安裝好後,就可以使用 trash-empty 指令來清空垃圾桶,如下所示,

1
$ trash-empty

C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 sched_setaffinity

本篇 ShengYu 介紹 C/C++ Linux/Unix 執行緒設定 CPU 的方法 sched_setaffinity()

主執行緒設定 CPU

主執行緒要設定跑在哪顆 CPU 的話,可以直接在 main 裡的主執行緒使用 sched_setaffinity() 設定即可,sched_setaffinity() 的第一個參數為 pid,
以我的電腦來說是單 CPU 4 核心,所以有 CPU0~CPU3 可以選擇,這邊示範選擇跑在 CPU3,

cpp-sched_setaffinity.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// g++ cpp-sched_setaffinity.cpp -o a.out
#include <stdio.h>
#include <sched.h> // for sched_setaffinity()
#include <unistd.h> // for getpid()

int main() {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("sched_setaffinity cpu%d\n", cpu_id);
sched_setaffinity(getpid(), sizeof(cpuset), &cpuset);

printf("sched_getcpu = %d\n", sched_getcpu());

return 0;
}

也可以使用 pthread_setaffinity_np() 來設定 main 主執行緒跑在哪個 CPU。

在 pthread 執行緒設定 CPU

這邊示範用 pthread 建立出來的執行緒設定 CPU,
sched_setaffinity() 的第一個參數為 pid,如果傳入0的話就是會設定當前的執行緒,所以這邊在 foo() 函式裡使用 sched_setaffinity() 來設定,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-sched_setaffinity-pthread.cpp -o a.out -pthread
#include <stdio.h>
#include <sched.h> // for sched_setaffinity()
#include <pthread.h>

void * foo(void *arg) {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("sched_setaffinity cpu%d\n", cpu_id);
sched_setaffinity(0, sizeof(cpuset), &cpuset);

printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
return NULL;
}

int main() {
pthread_t t1;
if (pthread_create(&t1, NULL, foo, NULL) != 0) {
fprintf(stderr, "Error: pthread_create\n");
}

//printf("sched_getcpu = %d\n", sched_getcpu());

pthread_join(t1, NULL);

return 0;
}

輸出結果如下,

1
2
sched_setaffinity cpu3
t1 thread sched_getcpu = 3

由於 sched_setaffinity() 的第一個參數是 pid,在指定 thread 要執行在哪顆 CPU 上的情況下不如 pthread_setaffinity_np() 來得方便,

在 C++ std::thread 執行緒設定 CPU

這邊示範用 C++ std::thread 建立出來的執行緒設定 CPU,基本上跟上例相似,

cpp-sched_setaffinity-std-thread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// g++ cpp-sched_setaffinity-std-thread.cpp -o a.out -std=c++11 -pthread
#include <iostream>
#include <thread>
#include <sched.h>
#include <pthread.h>
using namespace std;

void foo() {
int cpu_id = 3; // set thread to cpu3
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(cpu_id, &cpuset);

printf("sched_setaffinity cpu%d\n", cpu_id);
sched_setaffinity(0, sizeof(cpuset), &cpuset);

printf("t1 thread sched_getcpu = %d\n", sched_getcpu());
}

int main() {
thread t1(foo);

//printf("main thread sched_getcpu = %d\n", sched_getcpu());

if (t1.joinable()) {
t1.join();
}

return 0;
}

其它參考
sched_setaffinity(2) - Linux manual page
https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html
multithreading - how to set CPU affinity of a particular pthread? - Stack Overflow
https://stackoverflow.com/questions/1407786/how-to-set-cpu-affinity-of-a-particular-pthread

其它相關文章推薦
C/C++ 新手入門教學懶人包
C/C++ Linux/Unix 讓執行緒跑在指定 CPU 的方法 pthread_setaffinity_np
C/C++ Linux/Unix pthread 建立多執行緒用法與範例
C++ std::thread 建立多執行緒用法與範例

Python 捕捉 ctrl+c 事件的方法

本篇 ShengYu 介紹 Python 捕捉 ctrl+c 事件的方法,

在 Python 要捕捉 ctrl+c 事件的話可以向作業系統註冊 SIGINT 的 handler,當程式發生 SIGINT 的訊號時,就會執行先前註冊的 handler,Python 註冊 signal 是使用 signal.signal() 函式,使用之前要先 import signal 模組,signal.signal() 註冊 SIGINT 的用法如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import signal
import sys
import time

def signal_handler(signum, frame):
print('signal_handler: caught signal ' + str(signum))
if signum == signal.SIGINT.value:
print('SIGINT')
sys.exit(1)

signal.signal(signal.SIGINT, signal_handler)
print(signal.SIGINT)
while True:
time.sleep(1)

輸出如下,按下 ctrl+c 後會看到 ^C 字樣,接著就進入到我們定義的 signal_handler 函式裡,然後判斷是 SIGINT 就離開程式,

1
2
3
Signals.SIGINT
^Csignal_handler: caught signal 2
SIGINT

其它參考
signal — Set handlers for asynchronous events — Python 3 documentation
https://docs.python.org/3/library/signal.html
controls - How do I capture SIGINT in Python? - Stack Overflow
https://stackoverflow.com/questions/1112343/how-do-i-capture-sigint-in-python
Get signal names from numbers in Python - Stack Overflow
https://stackoverflow.com/questions/2549939/get-signal-names-from-numbers-in-python/35996948

其它相關文章推薦
C/C++ 捕捉 ctrl+c 事件的 2 種方法
Python 新手入門教學懶人包