Support exit status for exit/wait

One test case for returning a exit status
Passes usertests, but haven't used it to simplify tests
This commit is contained in:
Frans Kaashoek 2019-09-10 12:30:10 -04:00
parent 035cca95fe
commit 7e6c37e67e
22 changed files with 319 additions and 297 deletions

View file

@ -12,12 +12,12 @@ cat(int fd)
while((n = read(fd, buf, sizeof(buf))) > 0) {
if (write(1, buf, n) != n) {
printf("cat: write error\n");
exit();
exit(-1);
}
}
if(n < 0){
printf("cat: read error\n");
exit();
exit(-1);
}
}
@ -28,16 +28,16 @@ main(int argc, char *argv[])
if(argc <= 1){
cat(0);
exit();
exit(-1);
}
for(i = 1; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf("cat: cannot open %s\n", argv[i]);
exit();
exit(-1);
}
cat(fd);
close(fd);
}
exit();
exit(0);
}

View file

@ -15,5 +15,5 @@ main(int argc, char *argv[])
write(1, "\n", 1);
}
}
exit();
exit(0);
}

View file

@ -25,24 +25,24 @@ forktest(void)
if(pid < 0)
break;
if(pid == 0)
exit();
exit(0);
}
if(n == N){
print("fork claimed to work N times!\n");
exit();
exit(-1);
}
for(; n > 0; n--){
if(wait() < 0){
if(wait(0) < 0){
print("wait stopped early\n");
exit();
exit(-1);
}
}
if(wait() != -1){
if(wait(0) != -1){
print("wait got too many\n");
exit();
exit(-1);
}
print("fork test OK\n");
@ -52,5 +52,5 @@ int
main(void)
{
forktest();
exit();
exit(0);
}

View file

@ -41,24 +41,24 @@ main(int argc, char *argv[])
if(argc <= 1){
fprintf(2, "usage: grep pattern [file ...]\n");
exit();
exit(-1);
}
pattern = argv[1];
if(argc <= 2){
grep(pattern, 0);
exit();
exit(0);
}
for(i = 2; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf("grep: cannot open %s\n", argv[i]);
exit();
exit(-1);
}
grep(pattern, fd);
close(fd);
}
exit();
exit(0);
}
// Regexp matcher from Kernighan & Pike,

View file

@ -24,14 +24,14 @@ main(void)
pid = fork();
if(pid < 0){
printf("init: fork failed\n");
exit();
exit(-1);
}
if(pid == 0){
exec("sh", argv);
printf("init: exec sh failed\n");
exit();
exit(-1);
}
while((wpid=wait()) >= 0 && wpid != pid){
while((wpid=wait(0)) >= 0 && wpid != pid){
//printf("zombie!\n");
}
}

View file

@ -9,9 +9,9 @@ main(int argc, char **argv)
if(argc < 2){
fprintf(2, "usage: kill pid...\n");
exit();
exit(-1);
}
for(i=1; i<argc; i++)
kill(atoi(argv[i]));
exit();
exit(0);
}

View file

@ -7,9 +7,9 @@ main(int argc, char *argv[])
{
if(argc != 3){
fprintf(2, "Usage: ln old new\n");
exit();
exit(-1);
}
if(link(argv[1], argv[2]) < 0)
fprintf(2, "link %s %s: failed\n", argv[1], argv[2]);
exit();
exit(0);
}

View file

@ -77,9 +77,9 @@ main(int argc, char *argv[])
if(argc < 2){
ls(".");
exit();
exit(0);
}
for(i=1; i<argc; i++)
ls(argv[i]);
exit();
exit(0);
}

View file

@ -9,7 +9,7 @@ main(int argc, char *argv[])
if(argc < 2){
fprintf(2, "Usage: mkdir files...\n");
exit();
exit(-1);
}
for(i = 1; i < argc; i++){
@ -19,5 +19,5 @@ main(int argc, char *argv[])
}
}
exit();
exit(0);
}

View file

@ -9,7 +9,7 @@ main(int argc, char *argv[])
if(argc < 2){
fprintf(2, "Usage: rm files...\n");
exit();
exit(-1);
}
for(i = 1; i < argc; i++){
@ -19,5 +19,5 @@ main(int argc, char *argv[])
}
}
exit();
exit(0);
}

View file

@ -65,7 +65,7 @@ runcmd(struct cmd *cmd)
struct redircmd *rcmd;
if(cmd == 0)
exit();
exit(-1);
switch(cmd->type){
default:
@ -74,7 +74,7 @@ runcmd(struct cmd *cmd)
case EXEC:
ecmd = (struct execcmd*)cmd;
if(ecmd->argv[0] == 0)
exit();
exit(-1);
exec(ecmd->argv[0], ecmd->argv);
fprintf(2, "exec %s failed\n", ecmd->argv[0]);
break;
@ -84,7 +84,7 @@ runcmd(struct cmd *cmd)
close(rcmd->fd);
if(open(rcmd->file, rcmd->mode) < 0){
fprintf(2, "open %s failed\n", rcmd->file);
exit();
exit(-1);
}
runcmd(rcmd->cmd);
break;
@ -93,7 +93,7 @@ runcmd(struct cmd *cmd)
lcmd = (struct listcmd*)cmd;
if(fork1() == 0)
runcmd(lcmd->left);
wait();
wait(0);
runcmd(lcmd->right);
break;
@ -117,8 +117,8 @@ runcmd(struct cmd *cmd)
}
close(p[0]);
close(p[1]);
wait();
wait();
wait(0);
wait(0);
break;
case BACK:
@ -127,7 +127,7 @@ runcmd(struct cmd *cmd)
runcmd(bcmd->cmd);
break;
}
exit();
exit(0);
}
int
@ -166,16 +166,16 @@ main(void)
}
if(fork1() == 0)
runcmd(parsecmd(buf));
wait();
wait(0);
}
exit();
exit(0);
}
void
panic(char *s)
{
fprintf(2, "%s\n", s);
exit();
exit(-1);
}
int

View file

@ -43,7 +43,7 @@ main(int argc, char *argv[])
read(fd, data, sizeof(data));
close(fd);
wait();
wait(0);
exit();
exit(0);
}

View file

@ -3,8 +3,8 @@ struct rtcdate;
// system calls
int fork(void);
int exit(void) __attribute__((noreturn));
int wait(void);
int exit(int) __attribute__((noreturn));
int wait(int*);
int pipe(int*);
int write(int, const void*, int);
int read(int, void*, int);

File diff suppressed because it is too large Load diff

View file

@ -27,7 +27,7 @@ wc(int fd, char *name)
}
if(n < 0){
printf("wc: read error\n");
exit();
exit(-1);
}
printf("%d %d %d %s\n", l, w, c, name);
}
@ -39,16 +39,16 @@ main(int argc, char *argv[])
if(argc <= 1){
wc(0, "");
exit();
exit(0);
}
for(i = 1; i < argc; i++){
if((fd = open(argv[i], 0)) < 0){
printf("wc: cannot open %s\n", argv[i]);
exit();
exit(-1);
}
wc(fd, argv[i]);
close(fd);
}
exit();
exit(0);
}

View file

@ -10,5 +10,5 @@ main(void)
{
if(fork() > 0)
sleep(5); // Let child exit before parent.
exit();
exit(0);
}