用C语言写一个程序,能够运行其他可执行程序。

small_pumpkin 2011-03-27 10:41:33

基本要求:
unix环境,用C语言写一个程序,能够运行其他可执行程序。在shell内运行所写程序后,shell开始等待输入新的命令,此时输入在所写程序中定义的命令,指定的程序即被运行。
例如,当前文件夹下有个程序"hello.c",运行结果是输出"hello,world". 在你运行自己写的程序后,shell出现新的命令行,输入hello(或者其他你在所写程序内定义的命令,这里用hello只是举个例子)后,"hello.c"即被执行,shell内会出现输出"hello,world". 然后shell出现新的命令行,等待你输入其他命令,以执行不同的程序。
另外,被执行的文件不仅仅会存在于当前文件夹内,还可能出现在”/bin" 或者 "/usr/bin"内;换言之,假设你要执行的程序不在当前文件夹,而在"/bin"或者"/usr/bin"内,当你在shell内输入执行程序的命令后,你所写的程序还是可以找到要执行的程序。

拓展要求:
-程序能在后台运行;
-环境变量的使用;
-文件的重定向和IO的管道操作;
-命令和文件名的自动输入(在你输入命令或者文件名的部分内容后,按下tab键,shell会自动搜索匹配的命令或文件名,从而帮助你完成输入工作);
-其他可能的拓展.

人在课堂上刚接触C语言不久,学得很浅,这是学校布置的作业,毫无头绪,希望各位高手指点一二,感激不尽。
...全文
1302 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-11-07
  • 打赏
  • 举报
回复
问题的关键是遇到hello.c编译通不过咋办?
embed_rookie 2012-11-07
  • 打赏
  • 举报
回复
刚学c就要做这样的作业。。。不是你们学校的学生很牛逼 就是老师很牛逼啊 这个估计就是要实现一个简单的shell吧 楼主参考下fork 和 exec的用法
extremelove 2012-11-06
  • 打赏
  • 举报
回复
引用 11 楼 FlylyBird 的回复:
引用 8 楼 small_pumpkin 的回复:引用 3 楼 flylybird 的回复: 主要部分就是fork创建新进程,在子进程中用execve执行外部程序 如果这是作业的话楼主应该能在讲义里找到参考吧 谢谢你的回复,就是讲义当中没什么有用资料,也没有相应的例子,所以做起这份作业我是毫无头绪,请问可以给个例子参考吗? 下面贴的代码是《深入理解……
下面这个是我的答案 和system函数行为一样 #include "csapp.h" int mysystem(char *command); char command[MAXLINE]; main() { int exit_status; printf("Enter the command:\n"); fgets(command, MAXLINE, stdin); exit_status = mysystem(command); printf("exit status:%d\n", exit_status); return 0; } int mysystem(char *command) { char *arg[4]; int status = 0; arg[0] = "sh"; arg[1] = "-c"; arg[2] = (char*)Malloc(strlen(command)+1); strcpy(arg[2], command); arg[3] = NULL; if (Fork() == 0) Execve("/bin/sh", arg, NULL); Wait(&status); if (WIFEXITED(status)) return WEXITSTATUS(status); return status; } 这里有csapp的包装函数 不能直接编译 要找到csapp.h头文件 注释被我去掉了 从linux考到windows出现乱码了
extremelove 2012-11-06
  • 打赏
  • 举报
回复
引用 11 楼 FlylyBird 的回复:
引用 8 楼 small_pumpkin 的回复:引用 3 楼 flylybird 的回复: 主要部分就是fork创建新进程,在子进程中用execve执行外部程序 如果这是作业的话楼主应该能在讲义里找到参考吧 谢谢你的回复,就是讲义当中没什么有用资料,也没有相应的例子,所以做起这份作业我是毫无头绪,请问可以给个例子参考吗? 下面贴的代码是《深入理解……
刚好做到这题 你这个程序是错误的 sh -c command 的意思是从字符串中读取命令 根本不需要你解析command 只要把command当成字符串传递给sh就行了 而且你的代码很难看 根本不需要一个字符一个字符的的拷贝
沭水河畔 2011-04-03
  • 打赏
  • 举报
回复
楼主可以参考《Unix/Linux编程实践教程》里第9章,《可编程的shell、shell变量和环境:编写自己的shell》。
llllllzzzzzzcccccc 2011-03-28
  • 打赏
  • 举报
回复
我咋感觉有点像 shell+gcc 呢?
luciferisnotsatan 2011-03-28
  • 打赏
  • 举报
回复
直接用 system 函数?
AnYidan 2011-03-28
  • 打赏
  • 举报
回复
刚学 C 就有这样的作业,庆幸不在你们学校
沭水河畔 2011-03-28
  • 打赏
  • 举报
回复
這基本就是要求寫一個簡化版Shell嘛
FlylyBird 2011-03-28
  • 打赏
  • 举报
回复
主要部分就是fork创建新进程,在子进程中用execve执行外部程序
如果这是作业的话楼主应该能在讲义里找到参考吧
small_pumpkin 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 flylybird 的回复:]

引用 8 楼 small_pumpkin 的回复:
引用 3 楼 flylybird 的回复:

主要部分就是fork创建新进程,在子进程中用execve执行外部程序
如果这是作业的话楼主应该能在讲义里找到参考吧


谢谢你的回复,就是讲义当中没什么有用资料,也没有相应的例子,所以做起这份作业我是毫无头绪,请问可以给个例子参考吗?


下面贴的代码是《深入理解计算机系统》习题……
[/Quote]

非常感谢你的帮助,我会根据这些资料,自己尝试着做一下,有什么问题会再来请教。
FlylyBird 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 small_pumpkin 的回复:]
引用 3 楼 flylybird 的回复:

主要部分就是fork创建新进程,在子进程中用execve执行外部程序
如果这是作业的话楼主应该能在讲义里找到参考吧


谢谢你的回复,就是讲义当中没什么有用资料,也没有相应的例子,所以做起这份作业我是毫无头绪,请问可以给个例子参考吗?
[/Quote]

下面贴的代码是《深入理解计算机系统》习题8.17的解答,题目要求是编写int mysystem(char *command),该函数通过调用"/bin/sh -c command"来执行command,并返回执行状态(由整数表示)。楼主可以参考一下里面fork,execve的用法。

#include <stdio.h>
#include <stdlib.h>
#include "csapp.h"

#define null NULL

int mysystem(char *command)
{
int status=0;
int argc, i, j;
int length=0;
while (command[length] != 0) length++;

//assumes the number of arguments is 20 at most
char **argv=(char **)malloc((23)*sizeof(char *));

argv[0]=(char *)malloc(3*sizeof(char));
argv[0][0]='s';
argv[0][1]='h';
argv[0][2]=0;
argv[1]=(char *)malloc(3*sizeof(char));
argv[1][0]='-';
argv[1][1]='c';
argv[1][2]=0;

//load arguments from the command string
argc=1;
i=0;
while (command[i] != 0)
{
if ((command[i] != ' ') && (command[i] != '\n'))
{
argc++;
j=0;
argv[argc]=(char *)malloc(length*sizeof(char)); //length is the upper boundary
while ((command[i] != ' ') && (command[i] != '\n') && (command[i] != 0))
{
argv[argc][j]=command[i];
i++;
j++;
}
argv[argc][j]=0;
}
if (command[i] == 0) break;
while ((command[i] == ' ') || (command[i] == '\n')) i++;
}
argv[argc+1]=null;

i=0;
while (argv[i] != null)
{
j=0;
while (argv[i][j] != 0)
{
printf("%c", argv[i][j]);
j++;
}
printf("\n");
i++;
}

if (Fork() == 0)
{
execve("/bin/sh", argv, null);
}

waitpid(-1, &status, 0);
if (WIFEXITED(status))
{
return WEXITSTATUS(status);
}
else
{
return status;
}
}

void main()
{
char *command=(char *)malloc(200*sizeof(char));
int i;
for (i=0; i < 200; i++)
{
scanf("%c", &command[i]);
if (command[i] == '\n') break;
}
command[i+1]=0;

printf("%d\n", mysystem(command));
//one test command : ls
}


上面的代码引用了cmu教学的一个库,头文件和代码分别见
http://www.ece.cmu.edu/~ece845/sp02/csapp.c
http://www.ece.cmu.edu/~ece845/sp02/csapp.h
楼主可以直接从库中把Linux标准C的函数拿出来用即可
small_pumpkin 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 anyidan 的回复:]

刚学 C 就有这样的作业,庆幸不在你们学校
[/Quote]

嗯,这学校就是这样,课堂上教的内容很少,很浅,作业都比较难,要求学生自己回家研习。
small_pumpkin 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lishanchao 的回复:]

這基本就是要求寫一個簡化版Shell嘛
[/Quote]

对的,请问可以指点一二吗,或者有可供参考的相应例子吗,谢谢。
small_pumpkin 2011-03-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flylybird 的回复:]

主要部分就是fork创建新进程,在子进程中用execve执行外部程序
如果这是作业的话楼主应该能在讲义里找到参考吧
[/Quote]

谢谢你的回复,就是讲义当中没什么有用资料,也没有相应的例子,所以做起这份作业我是毫无头绪,请问可以给个例子参考吗?
small_pumpkin 2011-03-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 small_pumpkin 的回复:]
基本要求:
unix环境,用C语言写一个程序,能够运行其他可执行程序。在shell内运行所写程序后,shell开始等待输入新的命令,此时输入在所写程序中定义的命令,指定的程序即被运行。
例如,当前文件夹下有个程序"hello.c",运行结果是输出"hello,world". 在你运行自己写的程序后,shell出现新的命令行,输入hello(或者其他你在所写程序内定义的命令,这里……
[/Quote]

谢谢你的建议,我也知道打好基础的重要性,可是作业马上要交了,不得已的情况下才来此处求助。
npuhuxl 2011-03-27
  • 打赏
  • 举报
回复
http://unix-cd.com/unixcd12/article_5295.html

如果刚接触编程的话,还是先打好C语言基础吧!

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧