求助一道linux C语言的错误问题

zachary1984 2010-06-03 09:46:30
linux下编写C程序:在屏幕上显示提示符(prompt),接受从键盘输入,将从键盘输入的命令转化成(生成)新的进程,并且执行(运行)的这么一个程序。simplesh

如下:
$ ./simplesh
PROMPT>
PROMPT> date
Wed May 27 0:30:10 JST 2009
PROMPT> ls


要点:
1.根据下面所示,使用fork,在子进程使用exec系统调用,将子进程置换成输入的命令的进程
int pid;

if ((pid = fork()) == 0) {
/* 子进程的处理*/
} else if (pid >= 1) {
/* 父进程的处理*/
} else {
/* 错误处理*/
}
---------------------------------------------------------
下面是朋友写的代码,但是编译出错,请高手帮忙看一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
int pid;
char cmd[100] = {0};
char* ptr;
while(1)
{
ptr = cmd;
//输入prompt
printf("PROMPT>");
   //判断是否输入空格
while((*(ptr++)=getchar())!='\n');
*ptr = 0;
   //输入q,退出
if(!strcmp(cmd,"q\n"))
{
printf("exit\n");
return 0;
}
if ((pid = fork()) == 0)
{
 exec(cmd);
return 0;
}
else if (pid >= 1)
{
//等待子进程退出
  waitpid(-1, NULL,0);
}
else
{
puts("error");
return -1;
/* 错误处理*/
}
}
}
...全文
163 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sfd1234 2010-06-24
  • 打赏
  • 举报
回复
都是高手啊!
zhjl1314 2010-06-24
  • 打赏
  • 举报
回复
没有exec(cmd)
不过可以用system(cmd)

不知道你编码的目地是什么
要说明一点的是,system其实就是fork+exec的封装
如果单纯是为了应用,不需要你再fork了
非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复
非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复
直接用2L的代码吧,处理参数是个大问题,可以用lex等,不过那就复杂了

getopt说错了,它是用于自身参数的分析的。

要写完整的shell的话参考这个吧:
http://blog.csdn.net/kanghua/archive/2007/10/26/1844989.aspx
zachary1984 2010-06-23
  • 打赏
  • 举报
回复
麻烦你把完整的代码让我看一下可以么,比较着急,有时间一定好好学APUE,非常感谢!
[Quote=引用 5 楼 logic0 的回复:]
引用 4 楼 zachary1984 的回复:

恩 非常感谢,那 getopt(...);
state = execvp(command,options);
这段代码getopt(...)括号里应该写什么啊?还有那个option是什么内容?

引用 3 楼 logic0 的回复:
你的这个程序不能处理函数, ----->参数


man 3 getopt
[/Quote]
非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zachary1984 的回复:]

恩 非常感谢,那 getopt(...);
state = execvp(command,options);
这段代码getopt(...)括号里应该写什么啊?还有那个option是什么内容?

引用 3 楼 logic0 的回复:
你的这个程序不能处理函数, ----->参数
[/Quote]

man 3 getopt
zachary1984 2010-06-23
  • 打赏
  • 举报
回复
恩 非常感谢,那 getopt(...);
state = execvp(command,options);
这段代码getopt(...)括号里应该写什么啊?还有那个option是什么内容?

[Quote=引用 3 楼 logic0 的回复:]
你的这个程序不能处理函数, ----->参数
[/Quote]
非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复
你的这个程序不能处理函数, ----->参数
非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复


代码给你放上吧

你的这个程序不能处理函数,参看我给你写的那个流程,对参数的处理要用
getopt()。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main()
{
int pid;
char cmd[100] = {0};
char* ptr;
while(1)
{
ptr = cmd;

printf("PROMPT>");

gets(ptr); //这个函数不让用会有警告,换成fgets就行了

/*while((*(ptr++)=getchar())!='\n');
*ptr = 0;*/ //这两句执行完后cmd是空的,不信你puts下ptr

if(!strcmp(cmd,"q\n"))
{
printf("exit\n");
return 0;
}

if ((pid = fork()) == 0)
{
if(execlp(ptr," ",(char*)0) == -1) //不明白的直接谷歌exec函数族
puts("execvp error!\n");
return 0;
}
else
if (pid >= 1)
{
waitpid(pid,NULL,0);
}
else
{
puts("error");
return -1;
}
}
return 0;
}

非兔子_Logic0 2010-06-23
  • 打赏
  • 举报
回复


//楼主,磨刀不误砍柴工,仔细看APUE,这些都是最基本的问题
if ((pid = fork()) == 0)
{
  exec(cmd); //没有exec这个函数,exec族是6个函数的统称
return 0;
}


23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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