2009-02-11 89 views
1

對於C中的項目,我們需要在Unix服務器上構建一個shell。在Unix環境中,有沒有一種方法可以以編程方式調用C中的哪個?

它需要能夠執行Unix本身的功能,而不是bash(或任何其他Unix shell)。

我正在寫一個方法來希望將一個調用概括爲一個命令。到一個通用的功能:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/wait.h> 
#include <string.h> 
#include <limits.h> 

void execCmd(char* cmd,char* options) 
{ 
    char directory[MAX_CANON] = "/bin/"; //currently is just set to /bin 
    char* toExec = strcat(directory,cmd); 

我想設置變量'目錄'爲我打電話給Unix命令的正確目錄。所以,我希望能夠使用類似於 char目錄[MAX_CANON] = which(cmd)的東西;

這樣,哪個函數會返回我試圖調用的命令的目錄。

如果您覺得這不是一個好的解決方案,請推薦一些其他方法。

感謝

編輯:我想在最壞的情況,我可以做一個巨大的if-else語句,設置基於CMD參數的「目錄」 VBL。

回答

2

什麼你問的是命令「的」,即

[email protected]:~$ which which 
/usr/bin/which 

在Linux上是一個shell腳本,所以來看看甘德。

但是,我不認爲這是製作UNIX shell所必需的。如果您鍵入

man 3 exec 

你會發現,execlp()和execvp()照顧搜索給定的命令路徑和執行它的細節。

+0

謝謝,execlp(cmd,cmd,NULL);訣竅! – AndyG 2009-02-11 04:48:37

1

爲了實現這一點本身,我想:

  • 使用getenv獲取PATH
  • 解析PATH進入候選組件的列表(strtok種種缺點是經典的工具),
  • 對於每個PATH組件:表格/possible/path/to/cmd並使用stat家族函數來測試此文件是否存在並且用戶具有執行權限。繼續直到你找到它還是用完了PATH ...

編輯:你可能想跟隨符號連接,太。

1

不是我知道關閉,但你可以模仿輔助函數上的哪個功能。我需要在PATH環境變量中搜索名爲命令的文件,然後檢查該文件是否可執行,然後您可能會找到您的可執行文件。

要獲取PATH變量,您可以使用getenv()。你需要用strtok()分割它。對於搜索的目錄,你可以使用執行opendir(),將是這樣的:

#include <sys/types.h> 
#include <dirent.h> 

... 
    DIR *dir; 
    struct dirent *dp; 
... 
    if ((dir = opendir (".")) == NULL) { 
     perror ("Cannot open ."); 
     exit (1); 
    } 


    while ((dp = readdir (dir)) != NULL) { 
    } 
... 

檢查的READDIR()函數的手冊頁的dirent結構。

相關問題