新聞中心
linux 如何自定義命令函數(shù)?
你是想問在shell(比如說bash)下如何定義一個(gè)函數(shù)cuts嗎?
創(chuàng)新互聯(lián)公司自2013年創(chuàng)立以來,先為運(yùn)河等服務(wù)建站,運(yùn)河等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為運(yùn)河企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
如果是bash,那么就直接在shell 下輸入以下內(nèi)容
function cuts () {
echo "Hello world"
}
然后就可以在當(dāng)前終端下調(diào)用cuts了,比如
$ cuts
Hello world
如果你是想在某個(gè)腳本中調(diào)用函數(shù)cuts,那么只要把上面那段代碼加入腳本中,也就可以用了,比如
#!/bin/bash
function cuts ()
{
echo "Hello world"
}
....
cuts
....
Linux內(nèi)核中的exec函數(shù)有什么作用?
前三個(gè)和最后一個(gè)是兩個(gè)類型。前三個(gè)主要是Linux用來創(chuàng)建新的進(jìn)程(線程)而設(shè)計(jì)的,exec()系列函數(shù)則是用來用指定的程序替換當(dāng)前進(jìn)程的所有內(nèi)容。所以exec()系列函數(shù)經(jīng)常在前三個(gè)函數(shù)使用之后調(diào)用,來創(chuàng)建一個(gè)全新的程序運(yùn)行環(huán)境。Linux用init進(jìn)程啟動(dòng)其他進(jìn)程的過程一般都是這樣的。
下面說fork、vfork和clone三個(gè)函數(shù)。這三個(gè)函數(shù)分別調(diào)用了sys_fork、sys_vfork、sys_clone,最終都調(diào)用了do_fork函數(shù),差別在于參數(shù)的傳遞和一些基本的準(zhǔn)備工作不同。可見這三者最終達(dá)到的最本質(zhì)的目的都是創(chuàng)建一個(gè)新的進(jìn)程。在這里需要明確一下,Linux內(nèi)核中沒有獨(dú)立的“線程”結(jié)構(gòu),Linux的線程就是輕量級(jí)進(jìn)程,換言之基本控制結(jié)構(gòu)和Linux的進(jìn)程是一樣的(都是通過struct task_struct管理)。
fork是最簡(jiǎn)單的調(diào)用,不需要任何參數(shù),僅僅是在創(chuàng)建一個(gè)子進(jìn)程并為其創(chuàng)建一個(gè)獨(dú)立于父進(jìn)程的空間。fork使用COW(寫時(shí)拷貝)機(jī)制,并且COW了父進(jìn)程的??臻g。
vfork是一個(gè)過時(shí)的應(yīng)用,vfork也是創(chuàng)建一個(gè)子進(jìn)程,但是子進(jìn)程共享父進(jìn)程的空間。在vfork創(chuàng)建子進(jìn)程之后,父進(jìn)程阻塞,直到子進(jìn)程執(zhí)行了exec()或者exit()。vfork最初是因?yàn)閒ork沒有實(shí)現(xiàn)COW機(jī)制,而很多情況下fork之后會(huì)緊接著exec,而exec的執(zhí)行相當(dāng)于之前fork復(fù)制的空間全部變成了無(wú)用功,所以設(shè)計(jì)了vfork。而現(xiàn)在fork使用了COW機(jī)制,唯一的代價(jià)僅僅是復(fù)制父進(jìn)程頁(yè)表的代價(jià),所以vfork不應(yīng)該出現(xiàn)在新的代碼之中。在Linux的manpage中隊(duì)vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux為創(chuàng)建線程設(shè)計(jì)的(雖然也可以用clone創(chuàng)建進(jìn)程)。所以可以說clone是fork的升級(jí)版本,不僅可以創(chuàng)建進(jìn)程或者線程,還可以指定創(chuàng)建新的命名空間(namespace)、有選擇的繼承父進(jìn)程的內(nèi)存、甚至可以將創(chuàng)建出來的進(jìn)程變成父進(jìn)程的兄弟進(jìn)程等等。clone和fork的調(diào)用方式也很不相同,clone調(diào)用需要傳入一個(gè)函數(shù),該函數(shù)在子進(jìn)程中執(zhí)行。此外,clone和fork最大不同在于clone不再?gòu)?fù)制父進(jìn)程的棧空間,而是自己創(chuàng)建一個(gè)新的。
關(guān)于Linux命令的介紹,看看《linux就該這么學(xué)》,具體關(guān)于這一章地址3w(dot)linuxprobe/chapter-02(dot)html
怎么在linux中調(diào)用命令行中的命令,比如我想在一個(gè)程序中用命令行運(yùn)行另一個(gè)程序
Linux編程中在命令行啟動(dòng)另一個(gè)可執(zhí)行文件或調(diào)用命令用system函數(shù)最簡(jiǎn)單了,這個(gè)函數(shù)原理是在你編寫的那個(gè)程序的內(nèi)部啟動(dòng)另一個(gè)程序或命令,從而創(chuàng)建一個(gè)新進(jìn)程,并等待這個(gè)進(jìn)程執(zhí)行完畢退出。如果正常執(zhí)行,system函數(shù)將返回被執(zhí)行程序或命令的退出碼;如果無(wú)法運(yùn)行這個(gè)程序或命令,將返回錯(cuò)誤代碼127;如果是其他錯(cuò)誤,返回-1。這個(gè)函數(shù)的原型是:
#include stdlib.h
int system(const char *string);
參數(shù)string是將要執(zhí)行的程序文件名或路徑,如果是啟動(dòng)一個(gè)命令就是一個(gè)命令字符串。
還有一種執(zhí)行外部程序的方法是exec系列函數(shù),一般是在fork的子進(jìn)程里面調(diào)用exec系列函數(shù),那主進(jìn)程里直接調(diào)用exec系列不行嗎,為什么要fork再在子進(jìn)程里調(diào)用呢?因?yàn)閑xec系列的函數(shù)(包括execl函數(shù))都是將當(dāng)前進(jìn)程替換成新進(jìn)程,也就是說新進(jìn)程啟動(dòng)后原來的進(jìn)程就不存在了,exec系列函數(shù)后面的那些代碼就不會(huì)再執(zhí)行了。如果你不放在fork子進(jìn)程里面,那主進(jìn)程在執(zhí)行execl函數(shù)后就完全不存在了,所以exec系列函數(shù)的使用都是先f(wàn)ork然后在子進(jìn)程里面調(diào)用。因?yàn)閑xec系列函數(shù)都要使用fork調(diào)用,所以我一般是用system函數(shù)。
Linux中main函數(shù)參數(shù)argc和argv
argc:外部命令參數(shù)的個(gè)數(shù)
argv[]:存放各參
在linux中的目錄下執(zhí)行 g++ *.cpp -std=c++11 -o MD5 得到可執(zhí)行文件MD5
運(yùn)行MD5文件,并攜帶程序選項(xiàng)進(jìn)行測(cè)試 MD5 -h
分享名稱:linux中執(zhí)行命令函數(shù),linux如何執(zhí)行命令
標(biāo)題來源:http://www.dlmjj.cn/article/hdcejc.html