模拟实现myshell
直观地看来Linux下的Shell命令提示符:用户名@主机号 当前目录名 提示符
函数gethostname()可以获取到当前用户的主机号
原型如下:
#include <unistd.h>
int gethostname(char *name, size_t len);
参数说明:
这个函数需要两个参数:
接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名。
接收缓冲区name的最大长度
返回值:
如果函数成功,则返回0。如果发生错误则返回-1。错误号存放在外部变量errno中。
函数getcwd() 是获得执行程序的当前路径。为了做出区分,默认将主机名设置为root
代码如下:
#include
#include
#include
#include
#include
#define HOSTLEN 256
int main()
{
while(1)
{
char buf2[80];
getcwd(buf3,sizeof(buf2));
struct passwd *user;
user=getpwent();
char hostname[HOSTLEN];
struct hostent *hp;
gethostname(hostname,HOSTLEN);
printf("[%s@%s %s]# ",user->pw_name,hostname,buf2);
fflush(stdout);
char buf[1024];
ssize_t s=read(0,buf,sizeof(buf)-1);
if(s>0)
{
buf[s-1]=0;
printf("%s\n",buf);
}
char *start=buf;
char * _argv[32];
_argv[0]=start;
int i=1;
while(*start)
{
if(*start==' ')
{
*start=0;
start++;
_argv[i++]=start;
}
else
{
start++;
}
}
_argv[i]=NULL;
pid_t id=fork();
if(id==0)
{
execvp(_argv[0],_argv);
}
else
{
pid_t ret=waitpid(id,NULL,0);
}
}
return 0;
}