Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
21a88dd0
提交
21a88dd0
9月 06, 2006
创建
作者:
kaashoek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
some pipe support in sh
bug in proc_wait
上级
d49a2d53
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
141 行增加
和
85 行删除
+141
-85
cat.c
cat.c
+10
-10
proc.c
proc.c
+2
-2
sh.c
sh.c
+129
-73
没有找到文件。
cat.c
浏览文件 @
21a88dd0
...
...
@@ -27,17 +27,17 @@ main(int argc, char *argv[])
if
(
argc
<=
1
)
{
rfile
(
0
);
}
else
{
for
(
i
=
1
;
i
<
argc
;
i
++
){
fd
=
open
(
argv
[
i
],
0
);
if
(
fd
<
0
){
puts
(
"cat: cannot open "
);
puts
(
argv
[
i
]);
puts
(
"
\n
"
);
exit
();
for
(
i
=
1
;
i
<
argc
;
i
++
){
fd
=
open
(
argv
[
i
],
0
);
if
(
fd
<
0
){
puts
(
"cat: cannot open "
);
puts
(
argv
[
i
]);
puts
(
"
\n
"
);
exit
();
}
rfile
(
fd
);
close
(
fd
);
}
rfile
(
fd
);
close
(
fd
);
}
}
exit
();
...
...
proc.c
浏览文件 @
21a88dd0
...
...
@@ -371,7 +371,7 @@ proc_wait(void)
havekids
=
0
;
for
(
i
=
0
;
i
<
NPROC
;
i
++
){
p
=
&
proc
[
i
];
if
(
p
->
ppid
==
cp
->
pid
){
if
(
p
->
state
!=
UNUSED
&&
p
->
ppid
==
cp
->
pid
){
if
(
p
->
state
==
ZOMBIE
){
// Found one.
kfree
(
p
->
mem
,
p
->
sz
);
...
...
@@ -385,7 +385,7 @@ proc_wait(void)
havekids
=
1
;
}
}
// No point waiting if we don't have any children.
if
(
!
havekids
){
release
(
&
proc_table_lock
);
...
...
sh.c
浏览文件 @
21a88dd0
...
...
@@ -7,21 +7,28 @@
#define BUFSIZ 512
#define MAXARGS 10
#define MAXNODE 2
#define MAXCMD 2
// only allocate nodes for i/o redir; at some point we may have to build a
// a real parse tree.
struct
node
{
// an embarrassingly naive shell
// some day a real parse tree; for now ad-hoc
struct
ionode
{
int
token
;
char
*
s
;
};
struct
node
list
[
MAXNODE
];
int
next
node
;
struct
ionode
io
list
[
MAXNODE
];
int
next
io
;
char
buf
[
BUFSIZ
];
char
*
argv
[
MAXARGS
];
char
argv0buf
[
BUFSIZ
];
int
argc
;
struct
cmd
{
char
*
argv
[
MAXARGS
];
char
argv0buf
[
BUFSIZ
];
int
argc
;
int
token
;
};
struct
cmd
cmdlist
[
MAXCMD
];
int
nextcmd
;
char
buf
[
BUFSIZ
];
int
debug
=
0
;
int
parse
(
char
*
s
);
...
...
@@ -29,7 +36,7 @@ void runcmd(void);
int
ioredirection
(
void
);
int
gettoken
(
char
*
s
,
char
**
token
);
int
_gettoken
(
char
*
s
,
char
**
p1
,
char
**
p2
);
void
add
node
(
int
token
,
char
*
s
);
void
add
io
(
int
token
,
char
*
s
);
int
main
(
void
)
...
...
@@ -48,21 +55,25 @@ int
parse
(
char
*
s
)
{
char
*
t
;
int
c
;
int
c
,
i
;
gettoken
(
s
,
0
);
argc
=
0
;
nextnode
=
0
;
nextio
=
0
;
nextcmd
=
0
;
for
(
i
=
0
;
i
<
MAXCMD
;
i
++
)
{
cmdlist
[
i
].
argc
=
0
;
cmdlist
[
i
].
token
=
0
;
}
while
(
1
)
{
switch
((
c
=
gettoken
(
0
,
&
t
)))
{
case
'w'
:
// Add an argument
if
(
argc
=
=
MAXARGS
)
{
if
(
cmdlist
[
nextcmd
].
argc
>
=
MAXARGS
)
{
printf
(
2
,
"too many arguments
\n
"
);
return
-
1
;
}
argv
[
argc
++
]
=
t
;
cmdlist
[
nextcmd
].
argv
[
cmdlist
[
nextcmd
].
argc
++
]
=
t
;
break
;
case
'<'
:
// Input redirection
...
...
@@ -71,7 +82,7 @@ parse(char *s)
printf
(
2
,
"syntax error: < not followed by word
\n
"
);
return
-
1
;
}
add
node
(
'<'
,
t
);
add
io
(
'<'
,
t
);
break
;
case
'>'
:
// Output redirection
...
...
@@ -80,7 +91,13 @@ parse(char *s)
printf
(
2
,
"syntax error: > not followed by word
\n
"
);
return
-
1
;
}
addnode
(
'>'
,
t
);
addio
(
'>'
,
t
);
break
;
case
';'
:
// command sequence
case
'|'
:
// pipe
cmdlist
[
nextcmd
].
token
=
c
;
nextcmd
++
;
break
;
case
0
:
// String is complete
...
...
@@ -98,88 +115,127 @@ parse(char *s)
void
runcmd
(
void
)
{
int
i
,
r
,
pid
;
int
c
,
i
,
r
,
pid
,
tfd
;
int
fdarray
[
2
];
// Return immediately if command line was empty.
if
(
argc
==
0
)
{
if
(
cmdlist
[
0
].
argc
==
0
)
{
if
(
debug
)
printf
(
2
,
"EMPTY COMMAND
\n
"
);
return
;
}
// Clean up command line.
// Read all commands from the filesystem: add an initial '/' to
// the command name.
// This essentially acts like 'PATH=/'.
if
(
argv
[
0
][
0
]
!=
'/'
)
{
argv0buf
[
0
]
=
'/'
;
strcpy
(
argv0buf
+
1
,
argv
[
0
]);
argv
[
0
]
=
argv0buf
;
}
argv
[
argc
]
=
0
;
for
(
c
=
0
;
c
<=
nextcmd
;
c
++
)
{
// Clean up command line.
// Read all commands from the filesystem: add an initial '/' to
// the command name.
// This essentially acts like 'PATH=/'.
if
(
cmdlist
[
c
].
argv
[
0
][
0
]
!=
'/'
)
{
cmdlist
[
c
].
argv0buf
[
0
]
=
'/'
;
strcpy
(
cmdlist
[
c
].
argv0buf
+
1
,
cmdlist
[
c
].
argv
[
0
]);
cmdlist
[
c
].
argv
[
0
]
=
cmdlist
[
c
].
argv0buf
;
}
cmdlist
[
c
].
argv
[
cmdlist
[
c
].
argc
]
=
0
;
// Print the command.
if
(
debug
)
{
printf
(
2
,
"[%d] SPAWN:"
,
getpid
());
for
(
i
=
0
;
argv
[
i
];
i
++
)
printf
(
2
,
" %s"
,
argv
[
i
]);
for
(
i
=
0
;
i
<
nextnode
;
i
++
)
{
printf
(
2
,
"%c %s"
,
list
[
i
].
token
,
list
[
i
].
s
);
// Print the command.
if
(
debug
)
{
printf
(
2
,
"[%d] SPAWN:"
,
getpid
());
for
(
i
=
0
;
cmdlist
[
c
].
argv
[
i
];
i
++
)
printf
(
2
,
" %s"
,
cmdlist
[
c
].
argv
[
i
]);
for
(
i
=
0
;
i
<
nextio
;
i
++
)
{
printf
(
2
,
"%c %s"
,
iolist
[
i
].
token
,
iolist
[
i
].
s
);
}
printf
(
2
,
"
\n
"
);
}
printf
(
2
,
"
\n
"
);
}
if
(
strcmp
(
argv
[
0
],
"/cd"
)
==
0
)
{
if
(
debug
)
printf
(
2
,
"/cd %s is build in
\n
"
,
argv
[
1
]);
chdir
(
argv
[
1
]);
return
;
}
pid
=
fork
();
if
(
pid
==
0
)
{
if
(
ioredirection
()
<
0
)
exit
();
if
((
r
=
exec
(
argv0buf
,
(
char
**
)
argv
))
<
0
)
{
printf
(
2
,
"exec %s: %d
\n
"
,
argv
[
0
],
r
);
exit
();
if
(
strcmp
(
cmdlist
[
c
].
argv
[
0
],
"/cd"
)
==
0
)
{
if
(
debug
)
printf
(
2
,
"/cd %s is build in
\n
"
,
cmdlist
[
c
].
argv
[
1
]);
chdir
(
cmdlist
[
c
].
argv
[
1
]);
return
;
}
}
if
(
pid
>
0
)
{
if
(
debug
)
printf
(
2
,
"[%d] WAIT %s
\n
"
,
getpid
(),
argv
[
0
]);
wait
();
if
(
debug
)
printf
(
2
,
"[%d] wait finished
\n
"
,
getpid
());
if
(
cmdlist
[
c
].
token
==
'|'
)
if
(
pipe
(
fdarray
)
<
0
)
printf
(
2
,
"cmd %d pipe failed
\n
"
,
c
);
pid
=
fork
();
if
(
pid
==
0
)
{
if
(
cmdlist
[
c
].
token
==
'|'
)
{
if
(
close
(
1
)
<
0
)
printf
(
2
,
"close 1 failed
\n
"
);
if
((
tfd
=
dup
(
fdarray
[
1
]))
<
0
)
printf
(
2
,
"dup failed
\n
"
);
if
(
close
(
fdarray
[
0
])
<
0
)
printf
(
2
,
"close fdarray[0] failed
\n
"
);
if
(
close
(
fdarray
[
1
])
<
0
)
printf
(
2
,
"close fdarray[1] failed
\n
"
);
}
if
(
c
>
0
&&
cmdlist
[
c
-
1
].
token
==
'|'
)
{
if
(
close
(
0
)
<
0
)
printf
(
2
,
"close 0 failed
\n
"
);
if
((
tfd
=
dup
(
fdarray
[
0
]))
<
0
)
printf
(
2
,
"dup failed
\n
"
);
if
(
close
(
fdarray
[
0
])
<
0
)
printf
(
2
,
"close fdarray[0] failed
\n
"
);
if
(
close
(
fdarray
[
1
])
<
0
)
printf
(
2
,
"close fdarray[1] failed
\n
"
);
}
if
(
ioredirection
()
<
0
)
exit
();
if
((
r
=
exec
(
cmdlist
[
c
].
argv0buf
,
(
char
**
)
cmdlist
[
c
].
argv
))
<
0
)
{
printf
(
2
,
"exec %s: %d
\n
"
,
cmdlist
[
c
].
argv
[
0
],
r
);
exit
();
}
}
else
if
(
pid
>
0
)
{
int
p
;
if
(
debug
)
printf
(
2
,
"[%d] FORKED child %d
\n
"
,
getpid
(),
pid
);
if
(
c
>
0
&&
cmdlist
[
c
-
1
].
token
==
'|'
)
{
close
(
fdarray
[
0
]);
close
(
fdarray
[
1
]);
}
if
(
cmdlist
[
c
].
token
!=
'|'
)
{
if
(
debug
)
printf
(
2
,
"[%d] WAIT for children
\n
"
,
getpid
());
do
{
p
=
wait
();
if
(
debug
)
printf
(
2
,
"[%d] WAIT child %d finished
\n
"
,
getpid
(),
p
);
}
while
(
p
>
0
);
if
(
debug
)
printf
(
2
,
"[%d] wait finished
\n
"
,
getpid
());
}
}
}
}
int
ioredirection
(
void
)
{
int
i
,
fd
,
dfd
;
int
i
,
fd
;
for
(
i
=
0
;
i
<
next
node
;
i
++
)
{
switch
(
list
[
i
].
token
)
{
for
(
i
=
0
;
i
<
next
io
;
i
++
)
{
switch
(
io
list
[
i
].
token
)
{
case
'<'
:
if
(
close
(
0
)
<
0
)
printf
(
2
,
"close 0 failed
\n
"
);
if
((
fd
=
open
(
list
[
i
].
s
,
O_RDONLY
))
<
0
)
{
printf
(
2
,
"failed to open %s for read: %d"
,
list
[
i
].
s
,
fd
);
if
((
fd
=
open
(
io
list
[
i
].
s
,
O_RDONLY
))
<
0
)
{
printf
(
2
,
"failed to open %s for read: %d"
,
io
list
[
i
].
s
,
fd
);
return
-
1
;
}
if
(
debug
)
printf
(
2
,
"redirect 0 from %s
\n
"
,
list
[
i
].
s
);
printf
(
2
,
"redirect 0 from %s
\n
"
,
io
list
[
i
].
s
);
break
;
case
'>'
:
if
(
close
(
1
)
<
0
)
printf
(
2
,
"close 1 failed
\n
"
);
if
((
fd
=
open
(
list
[
i
].
s
,
O_WRONLY
|
O_CREATE
))
<
0
)
{
printf
(
2
,
"failed to open %s for write: %d"
,
list
[
i
].
s
,
fd
);
if
((
fd
=
open
(
io
list
[
i
].
s
,
O_WRONLY
|
O_CREATE
))
<
0
)
{
printf
(
2
,
"failed to open %s for write: %d"
,
io
list
[
i
].
s
,
fd
);
exit
();
}
if
(
debug
)
printf
(
2
,
"redirect 1 to %s
\n
"
,
list
[
i
].
s
);
printf
(
2
,
"redirect 1 to %s
\n
"
,
io
list
[
i
].
s
);
break
;
}
}
...
...
@@ -187,16 +243,16 @@ ioredirection(void)
}
void
add
node
(
int
token
,
char
*
s
)
add
io
(
int
token
,
char
*
s
)
{
if
(
next
node
>=
MAXNODE
)
{
printf
(
2
,
"add
node
: ran out of nodes
\n
"
);
if
(
next
io
>=
MAXNODE
)
{
printf
(
2
,
"add
io
: ran out of nodes
\n
"
);
return
;
}
list
[
nextnode
].
token
=
token
;
list
[
nextnode
].
s
=
s
;
next
node
++
;
iolist
[
nextio
].
token
=
token
;
iolist
[
nextio
].
s
=
s
;
next
io
++
;
}
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论