鸟哥是不会有这个的,可以这样想(感觉这样很麻烦,只用一对管道应该也可以,流程也能简单,控制好进程顺序就行。这个编得过):
#include <stdioh>
#include <stdlibh>
#include <stringh>
#include <fcntlh>
#include <unistdh>
#include <sys/waith>
#define CMD_LINE 1024
#define PIPE_MAX 16
#define ARG_MAX 10
typedef struct {
char arg[ARG_MAX];
char in;
char out;
} cmd_t;
extern int parse_token(char buf, cmd_t cmd[]);
extern int parse(char buf, cmd_t cmd);
extern int test_parse(cmd_t cmd[], int len);
int main(int argc, char argv[])
{
char buf[CMD_LINE];
cmd_t cmd[PIPE_MAX + 1];
int fd[PIPE_MAX][2];
int j, i;
int cmd_len, pipe_len;
pid_t pid;
while (1) {
printf("my_shell#");
fgets(buf, CMD_LINE, stdin);
buf[strlen(buf) - 1] = '\0';
cmd_len = parse_token(buf, cmd);
pipe_len = cmd_len - 1;
if (pipe_len > PIPE_MAX)
continue;
for (i = 0; i < pipe_len; ++i)
pipe(fd[i]);
for (i = 0; i < cmd_len; ++i)
if ((pid = fork()) == 0)
break;
if (pid == 0) {
if (pipe_len) {
if (i == 0) {
close(fd[i][0]);
dup2(fd[i][1], 1);
close(fd[i][1]);
for (j = 1; j < pipe_len; ++j)
close(fd[j][0]),
close(fd[j][1]);
} else if (i == pipe_len) {
close(fd[i - 1][1]);
dup2(fd[i - 1][0], 0);
close(fd[i - 1][0]);
for (j = 0; j < pipe_len - 1; ++j)
close(fd[j][0]),
close(fd[j][1]);
} else {
dup2(fd[i - 1][0], 0);
close(fd[i][0]);
dup2(fd[i][1], 1);
close(fd[i][1]);
for (j = 0; j < pipe_len; ++j) {
if ((j != i - 1)
|| (j != i))
close(fd[j][0]),
close(fd[j]
[1]);
}
}
}
if (cmd[i]in) {
int fd = open(cmd[i]in, O_RDONLY);
dup2(fd, STDIN_FILENO);
close(fd);
}
if (cmd[i]out) {
int fd =
open(cmd[i]out,
O_RDWR | O_CREAT | O_TRUNC, 0644);
dup2(fd, STDOUT_FILENO);
close(fd);
}
execvp(cmd[i]arg[0], cmd[i]arg);
fprintf(stderr, "Failed exec\n");
exit(127);
}
/ parent /
for (i = 0; i < pipe_len; ++i)
close(fd[i][0]), close(fd[i][1]);
for (i = 0; i < cmd_len; ++i)
wait(NULL);
}
return 0;
}
int parse_token(char buf, cmd_t cmd[])
{
int n = 0;
#if 1
char save_p;
char p = strtok_r(buf, "|", &save_p);
while (p != NULL) {
parse(p, &cmd[n++]);
p = strtok_r(NULL, "|", &save_p);
}
#else
cmd[n]arg[0] = "ls";
cmd[n]arg[1] = "-l";
cmd[n]arg[2] = NULL;
#endif
return n;
}
int test_parse(cmd_t cmd[], int len)
{
int i;
for (i = 0; i < len; ++i) {
printf("cmd[%d]:", i);
int j = 0;
while (cmd[i]arg[j])
printf(" %s", cmd[i]arg[j++]);
if (cmd[i]in)
printf("\tin:%s", cmd[i]in);
if (cmd[i]out)
printf("\tout:%s", cmd[i]out);
printf("\n");
}
return 0;
}
int parse(char buf, cmd_t cmd)
{
int i = 0;
cmd->in = NULL;
cmd->out = NULL;
char p = strtok(buf, " ");
while (p) {
if (p == '<') {
if ((p + 1))
cmd->in = p + 1;
else
cmd->in = strtok(NULL, " ");
} else if (p == '>') {
if ((p + 1))
cmd->out = p + 1;
else
cmd->out = strtok(NULL, " ");
} else
cmd->arg[i++] = p;
p = strtok(NULL, " ");
}
cmd->arg[i] = NULL;
return 0;
}
当然是在linux系统下啦,shell是包裹在linux内核的外壳,你要和linux系统交互,就要通过和shell与之交互。其实也就是翻译的角色,所以shell本身就是命令解析器,就是环境。
它c语言没什么联系,除了它本身是C语言写的以外。。。
这是两种不同的编程方式。比如,C程序可以再VC++编译器中编译。而Java程序可以用eclipse。shell脚本则可以在linux的外壳shell下。
shell是linux一个人机界面的程序。它有ksh,bsh,csh,tsh等等,每种shell尽管都差不多,但都分别有些差别,具体写script的时候,需要看对应的shell的语法。
一个shell程序用什么解释,是体现在开头这句,和其他手稿语言如perl一样。格式如下:
#!/bin/sh
表明这个手稿程序,是用bash解释的。
shell是一个命令处理器(command processor)——是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。shell拥有自己的语言允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等。用户可以生成像其他应用程序一样复杂的shell程序。
补充说明:简单的说 : shell 是一个交互性命令解释器。shell独立于 *** 作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给 *** 作系统(内核)执行。
一下是shell功能的一个汇总:
查找命令的位置并且执行相关联的程序。
为shell变量赋新值
执行命令替代
处理 I/O重定向和管道功能
提供一个解释性的编程语言界面,包括tests、branches和loops等语句
#!/bin/sh
for ((i=1;i<20;i=i+2));
do
echo $i
done
类似于DOS下的commandcom和后来的cmdexe。它接收用户命令,然后调用相应的应用程序。
命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
bash / sh / ksh / csh / zsh(Unix/linux 系统)
扩展资料:
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
文字 *** 作系统与外部最主要的接口就叫做shell。shell是 *** 作系统最外面的一层。shell管理与 *** 作系统之间的交互:等待输入,向 *** 作系统解释你的输入,并且处理各种各样的 *** 作系统的输出结果。
shell提供了与 *** 作系统之间通讯的方式。这种通讯可以以交互方式,或者以shell script方式执行。shell script是放在文件中的一串shell和 *** 作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
执行一个shell程序的一种方法是:sh shell_program arguments这种方式激活一个子shell并且指定这个子shell为执行这个程序的命令解释器。这个程序文件不是必须为可执行的。也可以在shell程序的第一行前加入#!/usr/bin/ shell_name来指定命令行解释器。因此,如果你当前正在Bourne shell下工作,但是想要执行一个C shell的脚本,你的C shell程序的第一行应该为:此时shell脚本的许可权限必须被设置为可读和可执行。为了让shell可以找到程序,可以选择输入shell脚本的完全路径名,或者将这个脚本的路径放在于PATH环境变量指定的路径列表中。
shell脚本和windows平台上的bat批处理是一样的,简化用户处理重复动作的 *** 作,shell脚本由shell命令组成。
工具/原料
vim
ubuntu
方法/步骤
新建一个文件shell脚本一般用×sh作为后缀当然勇气他的也可以。打开终端输入touch
firstsh
新建一个名为first的shell脚本。
编写一个简单的linuxshell脚本
使用vim
编辑firstsh也可以用其他的文本编辑器,推荐使用vim
使用命令
vim
firstsh打开,输入i进入编辑模式。
编写一个简单的linuxshell脚本
我们写入一个简单的shell脚本,注意第一行的代码解释器的指定,这里使用的是/bin/bash/
解释器
也可用其他的根据个人情况自己选择。
脚本解释:
echo
//显示一串字符并自动换行
read
NAME
//从屏幕获取一段字符,并赋予NAME
$NAME
//取NAME变量的值
#
//只用一个#表示注释文本
编写一个简单的linuxshell脚本
文件写完后按下esc键
退出插入模式,接着输入:wq
保存文本并退出文本编辑。
编写一个简单的linuxshell脚本
输入sh
+
脚本名称
运行脚本,或给文件可运行权限
chmod
+x
然后输入/firstsh运行脚本。
以上就是关于如何用c语言写一个shell全部的内容,包括:如何用c语言写一个shell、在哪里编写shell程序、unix的shell程序怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)