uname是怎麼執行的?
隨手在鍵盤敲擊乙個uname -a,系統資訊就出來了:
linux my 2.6.8-2-686-smp #1 smp tue aug 16 12:08:30 utc 2005 i686 unknown unknown gnu/linux
可是執行該命令時,系統究竟做了什麼?如果查閱coreutils的uname.c檔案就會發現其實uname使用了乙個系統呼叫sys_uname:
asmlinkage int sys_uname(struct old_utsname __user * name)
name作為傳出引數接受核心的返回,可見系統通過儲存乙個靜態的變數system_utsname來支援uname系統呼叫,我們看一下最重要的結構體:
struct utsname ;
從每個欄位的名字可以看出uname支援的選項,-s,-n,-r,-v,-m,-a(--all),從上面uname -a的輸出也可以看出輸出資訊分為5個段。最後看一下系統保留的那個靜態結構體,作為系統呼叫uname的結果:
struct new_utsname system_utsname = ;
who/users等命令是怎麼執行的?
who/users命令使用了乙個檔案,在我的系統上,它的全路徑是:/var/run/utmp,該檔案中儲存了乙個下列結構體的陣列:
struct utmp ;
這個檔案既然儲存了乙個結構體陣列,因此也就不要指望可以將該檔案作為文字檔案來讀取了,雖然它也不是可以要做成二進位制的。如果想解析該檔案,那麼必須逐陣列元素逐字段地解析,下面的函式是解析流程:
int read_utmp (const char *filename, int *n_entries, struct_utmp **utmp_buf)
命令who的執行過程不外乎就是:
static void who (const char *filename)
tty命令是怎麼執行的?
在任意終端輸入tty命令,得到的是諸如/dev/ttyn,/dev/pts/n之類的輸出,這是怎麼回事?看一下coreutils的tty.c的源**之後就會發現實際上tty呼叫了乙個叫做ttyname的函式,實際上就是取得標準輸入,也就是檔案描述符0所對應的裝置檔案,如下:
koal-eccdev-01:~/coreutils/coreutils-5.0/src# tty
/dev/pts/0
如果將標準輸入重定向到乙個普通檔案:
koal-eccdev-01:~/coreutils/coreutils-5.0/src# tty 0>aaa
not a tty
說明ttyname正如man手冊描述的那樣,會檢查終端裝置的正確性,如果在/dev/pts/0上執行下面的:
koal-eccdev-01:~/coreutils/coreutils-5.0/src# tty 0>/proc/25542/fd/0 #25542為pts/1的ping 127.0.0.1
/dev/pts/1
可見輸出的是別的終端,其實只要在/dev/pts/n上執行tty 0 > /dev/pts/m(m!=n)即可
coreutils 5 0中幾個命令的執行過程
uname是怎麼執行的?隨手在鍵盤敲擊乙個uname a,系統資訊就出來了 linux my 2.6.8 2 686 smp 1 smp tue aug 16 12 08 30 utc 2005 i686 unknown unknown gnu linux 可是執行該命令時,系統究竟做了什麼?如果查...
python中執行shell命令的幾個方法
這篇文章主要介紹了python中執行shell命令的幾個方法,本文一共給出3種方法實現執行shell命令,需要的朋友可以參考下 最近有個需求就是頁面上執行shell命令,第一想到的就是os.system,如下 os.system cat proc cpuinfo 但是發現頁面上列印的命令執行結果 0...
python中執行shell命令的幾個方法小結
最近有個需求就是頁面上執行shell命令,第一想到的就是os.system,複製 如下 os.system cat proc cpuinfo 但是發現頁面上列印的命令執行結果 0或者1,當然不滿足需求了。嘗試第二種方案 os.popen 複製 如下 output os.popen cat proc ...