sleep
#include "kernel/types.h"
#include "user/user.h"
int main(int argc, char *argv[])
{
if (argc < 2)
{
fprintf(2, "sleep: missing operand\n");
exit(1);
}
int ret = sleep(atoi(argv[1]));
if (ret == -1)
{
exit(1);
}
exit(0);
}
pingpong
#include "kernel/types.h"
#include "user/user.h"
int main(void)
{
int fd1[2];
int fd2[2];
int pid;
char buf[1] = {'a'};
pipe(fd1);
pipe(fd2);
pid = fork();
if (pid == 0)
{
close(fd1[0]);
close(fd2[1]);
write(fd1[1],buf,sizeof(buf));
printf("%d: received ping\n",getpid());
read(fd2[0],buf,sizeof(buf));
}
else
{
close(fd1[1]);
close(fd2[0]);
read(fd1[0],buf,sizeof(buf));
printf("%d: received pong\n",getpid());
write(fd2[1],buf,sizeof(buf));
}
exit(0);
}
primes
#include "kernel/types.h"
#include "user/user.h"
void prime(int fd)
{
int num;
if (read(fd, &num, 4) == 0)
{
close(fd);
return;
}
printf("prime %d\n", num);
int p[2];
pipe(p);
int pid = fork();
if (pid > 0)
{
close(p[0]);
int n;
while ((read(fd, &n, 4)) != 0)
{
if (n % num != 0)
{
write(p[1], &n, 4);
}
}
close(p[1]);
wait(0);
}
else
{
close(p[1]);
prime(p[0]);
}
}
int main(void)
{
int p[2];
pipe(p);
int pid = fork();
if (pid > 0)
{
close(p[0]);
for (int i = 2; i <= 35; i++)
{
write(p[1], &i, 4);
}
close(p[1]);
}
else
{
close(p[1]);
prime(p[0]);
}
exit(0);
}
find
#include "kernel/types.h"
#include "kernel/stat.h"
#include "kernel/fcntl.h"
#include "user/user.h"
#include "kernel/fs.h"
void find(char *path, char *target)
{
char buf[512], *p;
int fd;
struct dirent de;
struct stat st;
if ((fd = open(path, O_RDONLY)) < 0)
{
fprintf(2, "find: cannot open %s\n", path);
return;
}
if (fstat(fd, &st) < 0)
{
fprintf(2, "find: cannot stat %s\n", path);
close(fd);
return;
}
if (st.type == T_FILE || st.type == T_DEVICE)
{
for (p = path + strlen(path); p >= path && *p != '/'; p--)
;
p++;
if (strcmp(p, target) == 0)
{
printf("%s\n", path);
}
close(fd);
return;
}
strcpy(buf, path);
p = buf + strlen(buf);
*p++ = '/';
while (read(fd, &de, sizeof(de)) == sizeof(de))
{
if (de.inum == 0 || strcmp(de.name, ".") == 0 || strcmp(de.name, "..") == 0)
{
continue;
}
memmove(p, de.name, DIRSIZ);
p[DIRSIZ] = 0;
find(buf, target);
}
close(fd);
}
int main(int argc, char *argv[])
{
if (argc < 2)
{
fprintf(2, "find: missing operand\n");
exit(1);
}
else if (argc == 2)
{
find(".", argv[1]);
exit(0);
}
find(argv[1], argv[2]);
exit(0);
}
xargs
#include "kernel/types.h"
#include "kernel/stat.h"
#include "kernel/fcntl.h"
#include "user/user.h"
#include "kernel/param.h"
#define BUFFR_SIZE 512
int main(int argc, char *argv[])
{
int n;
char buffer[BUFFR_SIZE];
char *exec_argv[MAXARG];
if (argc < 2)
{
exec_argv[0] = "echo";
}
else
{
exec_argv[0] = argv[1];
}
for (int i = 2; i < argc; i++)
{
exec_argv[i - 1] = argv[i];
}
while ((n = read(0, buffer, sizeof(buffer))) > 0)
{
char args[512] = {'\0'};
char *end;
int length;
while (n > 0)
{
end = strchr(buffer, '\n');
length = end - buffer;
memmove(args, buffer, end - buffer);
int pid = fork();
if (pid < 0)
{
fprintf(2, "Error: fork failed\n");
exit(1);
}
else if (pid == 0)
{
exec_argv[argc - 1] = args;
exec(exec_argv[0], exec_argv);
}
wait(0);
memmove(buffer, buffer + length + 1, length + 1);
n -= (length + 1);
}
}
if (n < 0)
{
fprintf(2, "xargs: read error\n");
exit(1);
}
exit(0);
}