在linux的應用程式裡面呼叫我的shell(這玩意功能實在太強大)的辦法有很多種一般來說有fork()、exec*()、pipe、system()其中又以system()
呼叫很少方便,現在加以說明。
#include
#include
int main()
system(「ifconfig eth0 10.17.28.1」);
//system(「./ifconfig.sh」);使用你的指令碼shell路徑要注意
return 0;
exec*
方法二: exec( )函式族***
下面我們來看看乙個程序如何來啟動另乙個程式的執行。在linux中要使用exec函式族。系統呼叫execve()對當前程序進行替換,替換者為乙個指定的程式,其引數包括檔名(filename)、引數列表(argv)以及環境變數(envp)。exec函式族當然不止乙個,但它們大致相同,在 linux中,它們分別是:execl,execlp,execle,execv,execve和execvp,下面我只以execlp為例,其它函式究竟與execlp有何區別,請通過manexec命令來了解它們的具體情況。
乙個程序一旦呼叫exec類函式,它本身就"死亡"了,系統把**段替換成新的程式的**,廢棄原有的資料段和堆疊段,並為新程式分配新的資料段與堆疊段,唯一留下的,就是程序號,也就是說,對系統而言,還是同乙個程序,不過已經是另乙個程式了。(不過exec類函式中有的還允許繼承環境變數之類的資訊。)
那麼如果我的程式想啟動另一程式的執行但自己仍想繼續執行的話,怎麼辦呢?那就是結合fork與exec的使用。 下面一段**顯示如何啟動執行其它程式:
char command[256];
void main()
int rtn; /*子程序的返回數值*/
while(1)
/* 從終端讀取要執行的命令 */
printf( ">" );
fgets( command, 256, stdin );
command[strlen(command)-1] = 0;
if ( fork() == 0 )
/* 子程序執行此命令 */
execlp( command, command );
/* 如果exec函式返回,表明沒有正常執行命令,列印錯誤資訊*/
perror( command ); exit( errorno ); }
else
/* 父程序, 等待子程序結束,並列印子程序的返回值 */
wait ( &rtn );
printf( " child process return %d\n",. rtn );
此程式從終端讀入命令並執行之,執行完成後,父程序繼續等待從終端讀入命令。熟悉dos和windows系統呼叫的朋友一定知道
dos/windows 也有exec類函式,其使用方法是類似的,但dos/windows還有spawn類函式,因為dos是單任務的系統,它只能將"父程序"駐留在機器內再執行"子程序",這就是spawn類的函式。win32已經是多工的系統了,但還保留了spawn類函式,win32中實現spawn函式的方法同前述 unix中的方法差不多,開設子程序後父程序等待子程序結束後才繼續執行。unix在其一開始就是多工的系統,所以從核心角度上講不需要spawn類函式。
system 是在單獨的程序中執行命令,完了還會回到你的程式中。
而exec函式是直接在你的程序中執行新的程式,新的程式會把你的程式覆蓋,除非呼叫出錯,否則你再也回不到exec後面的**,就是說你的程式就變成了exec呼叫的那個程式了.
#include
#include
#include
int main(int argc, char *argv) ;
char *argv_execv = ;
char *argv_execvp = ;
char *argv_execve = ;
if (fork() == 0)
if (fork() == 0)
if (fork() == 0)
if (fork() == 0)
if (fork() == 0)
if (fork() == 0)
return 0;
}程式裡呼叫了2 個linux 常用的系統命令,echo和env。echo會把後面跟的命令列引數原封不動的列印出來,env用來列出所有環境變數。
由於各個子程序執行的順序無法控制,所以有可能出現乙個比較混亂的輸出–各子程序列印的結果交雜在一起,而不是嚴格按照程式中列出的次序。
最常見的錯誤:
大家在平時的程式設計中,如果用到了exec 函式族,一定記得要加錯誤判斷語句。因為與其他系統呼叫比起來,exec很容易受傷,被執行檔案的位置,許可權等很多因素都能導致該呼叫的失敗。
最常見的錯誤是:
1)找不到檔案或路徑,此時errno 被設定為enoent;
2)陣列argv和envp忘記用null結束,此時errno被設定為efault;
3)沒有對要執行檔案的執行許可權,此時errno被設定為eacces。
linux 應用程式裡面呼叫shell
在linux的應用程式裡面呼叫我的shell 這玩意功能實在太強大 的辦法有很多種一般來說有fork exec pipe system 其中又以system 呼叫很少方便,現在加以說明。include include int main system ifconfig eth0 10.17.28.1 ...
利用應用UID呼叫應用程式
利用應用uid呼叫應用程式 from forum nokia wiki 利用應用uid呼叫應用程式通常有兩種方法 便可以啟用相機程式。二.使用tapatask類 便可以呼叫瀏覽器並直接訪問移動夢網。以下是一些常用功能的uid 瀏覽器0x10008d39 日曆0x10005901 情景模式0x1000...
利用應用UID呼叫應用程式
利用應用uid呼叫應用程式通常有兩種方法 例如 便可以啟用相機程式。二.使用tapatask類 便可以呼叫瀏覽器並直接訪問移動夢網。以下是一些常用功能的uid 瀏覽器0x10008d39 日曆0x10005901 情景模式0x100058f8 名片夾0x101f4cce 待辦事項0x10005900...