For my OS class I have the assignment of implementing Unix's cat command with system calls (no scanf or printf). Here's what I got so far:
(Edited thanks to responses)
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
main(void)
{
   int fd1; 
   int fd2;
   char *buffer1;
   buffer1 = (char *) calloc(100, sizeof(char));
   char *buffer2;
   buffer2 = (char *)calloc(100, sizeof(char));
   fd1 = open("input.in", O_RDONLY);    
   fd2 = open("input2.in", O_RDONLY);
   while(eof1){ //<-lseek condition to add here
   read (fd1, buffer1, /*how much to read here?*/ );
   write(1, buffer1, sizeof(buffer1)-1);     
   }
   while (eof2){ 
    read (fd2,buffer2, /*how much to read here?*/);  
    write(1, buffer2, sizeof(buffer2)-1);
    }
}
The examples I have seen only show read with a known number of bytes. I don't know how much bytes each of the read files will have, so how do I specify read's last paramether?
read into a buffer, you have to allocate one. Either on the stack (easiest) or with mmap.perror is a complicated library function, not a system call.exit is not a system call on Linux. But _exit is.write more bytes than you have read before.Edit: Here is my code, using only system calls. The error handling is somewhat limited, since I didn't want to re-implement perror.
#include <fcntl.h>
#include <unistd.h>
static int
cat_fd(int fd) {
  char buf[4096];
  ssize_t nread;
  while ((nread = read(fd, buf, sizeof buf)) > 0) {
    ssize_t ntotalwritten = 0;
    while (ntotalwritten < nread) {
      ssize_t nwritten = write(STDOUT_FILENO, buf + ntotalwritten, nread - ntotalwritten);
      if (nwritten < 1)
        return -1;
      ntotalwritten += nwritten;
    }
  }
  return nread == 0 ? 0 : -1;
}
static int
cat(const char *fname) {
  int fd, success;
  if ((fd = open(fname, O_RDONLY)) == -1)
    return -1;
  success = cat_fd(fd);
  if (close(fd) != 0)
    return -1;
  return success;
}
int
main(int argc, char **argv) {
  int i;
  if (argc == 1) {
    if (cat_fd(STDIN_FILENO) != 0)
      goto error;
  } else {
    for (i = 1; i < argc; i++) {
      if (cat(argv[i]) != 0)
        goto error;
    }
  }
  return 0;
error:
  write(STDOUT_FILENO, "error\n", 6);
  return 1;
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With