2010-11-24 85 views
1

我應該創建一個使用C.下面是我的代碼Linux命令創建Linux外殼:幫助,用C

#include <stddef.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#define SHELL "/bin/sh" 
#include "extern.h" 

int mysystem (char *command) 
{ 
    int status; 
    pid_t pid; 

    pid = fork(); 
    if (pid == 0) 
    { 

     execl (SHELL, SHELL, "-c", command, NULL); 
     _exit (EXIT_FAILURE); 
    } 
    else if (pid < 0) 

    status = -1; 
    else 

    if (waitpid (pid, &status, 0) != pid) 
     status = -1; 
    return status; 
} 

一切都是正確的,當我測試使用如「ls」不同的命令代碼, 「人」,等等。但是當我使用記事本創建一個包含testfile的以下內容:

echo "hello" 
exit 2 

返回代碼出來是512當它應該只是2。 任何人都可以幫助我解決我的代碼?

+0

誰能幫我編輯我的問題。有些東西缺失。 thx – Brian 2010-11-24 21:52:50

+0

當你在回聲「你好」之後加上分號時它會工作嗎? – 2010-11-24 21:55:28

+0

@Amir阿富汗尼:不,它不起作用 – Brian 2010-11-24 21:57:25

回答

0

通過記事本你的意思是你使用Windows程序來創建一個Unix shell腳本?這是行不通的,因爲你最終在每行的結尾使用CRLF而不是LF。嘗試腳本上的「dos2unix」命令將其轉換爲Unix格式,然後運行它。

我假設你知道系統()庫調用中已有代碼。從你的功能名稱判斷,我猜你只是想學習如何通過系統調用來完成它。

+0

你是什麼意思,代碼已經在system()庫調用中可用?能給我看看麼? – Brian 2010-11-26 23:00:26

4

status不是退出代碼;它也包含其他信息。通常返回值位於status的8-15位,但您應該使用wait.h中的宏以便攜方式從status中提取返回值。

請注意512是2<<8

4

請確保您的status值使用的宏如WIFEXITEDWEXITSTATUS。請參閱waitpid的操作系統手冊頁。 Here是對waitpid上的POSIX要求的描述。

0

嘗試圍繞你的command字符串你提供給/bin/sh引號,否則空格字符使/bin/sh認爲你提供另一種選擇外殼本身,而不是命令你打電話。例如,嘗試這在終端:

/bin/sh -c exit 2 
echo $? 

/bin/sh -c "exit 2" 
echo $? 

第一個給出0,而第二個得到所需2