2010-11-24 95 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