OS interface: file and I/O system calls • File operations in C/C++? – fopen(), fread(), fwrite(), fclose(), fseek() in C f.open(…), f.close(…) in C++ • I/O operation in C/C++ – printf(), scanf() in C – cin, cout, cerr in C++ • At the UNIX OS interface, File and I/O operations in the UNIX system share the same interface. – open(), read(), write(),close() …… – I/O devices are treated as special files (see /dev directory) • File .vs. open file – file - passive container of data; a named sequence of bytes – open file – a file that is opened in a process • active sources and sinks for data, need to maintain current position of the open file. – File – Current file position » Maintained by the OS » May shared among different processes • File and I/O system calls – open a file int open(const char* path, int flags, mode_t modes) // path: file name, flags: type of open, modes: file permission, only when the file is being created. // return a non negative number when successful, -1 when fail Example: fd = open(“/etc/passwd”, O_RDONLY); – Each open creates a new open file (even if the same file is opened). – read a file ssize_t read(int fd, void *buf, size_t nbyte) // read nbyte data from file fd to buffer buf // fd: file descriptor // buf: pointer to the buffer to hold the data from the file // nbyte: number of bytes to be read // return total number of bytes read, 0 for end of file, -1 when error Example: number = read(fd, buffer, count); • File and I/O system calls (continue) – write to a file ssize_t write(int fd, const void *buf, size_t nbyte); Example: number = write(fd, buffer, count); – close a file int close(int fd); – create a file int creat(const char *path, mode_t mode); // the meaning of mode, // also determined by mask, see man -a umask. creat(path, mode) = open(path, O_WRONLY | O_CREAT | O_TRUNC, mode) void FileCopy(char *fromFile, char *toFile) { int fromFD = open(fromFile, O_RDONLY); if (fromFD < 0) { cerr << “Error opening” << fromFile << “\n”; return; } int toFD = creat(toFile, 0666); if (toFD < 0) { cerr << “Error opening” << toFile << “\n”; close(fromFD); return; } while (1) { char ch; int n = read (fromFD, &ch, 1); if (n <= 0) break; // end of file n = write(toFD, &ch, 1); if (n < 0) {cerr << “Error\n”; return;} } close(fromFD); close(toFD); } Example1.cpp Control the position to read/write: lseek from/to where the file is read/written: (file pointer, an implicit parameter) #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence) whence: SEEK_SET begin + offset SEEK_CUR current + offset SEEK_END end + offset Example: lseek(fd, (off_t)(-1), SEEK_CUR); lseek(fd, (off_t)0, SEEK_END); lseek(fd, (off_t)0, SEEK_SET); // Example2.cpp void ReverseFile(char *fromFile, char *toFile) { int fromFd = open(fromFile, O_RDONLY); int toFd = creat(toFile, 0666); lseek(fromFd, (off_t)(-1), SEEK_END); while(1) { char ch; int n = read(fromFd, &ch, 1); n = write(toFd, &ch, 1); if (n < 0) {cerr << “Error\n”; exit(0);} if (lseek(fromFd, (off_t)(-2), SEEK_CUR) < 0) break; } close(toFd); close(fromFd); } • File meta-information - information about the file that isn’t in the file, such as: – Owner, permissions, timestamps, size, etc. – Try an “ls -l” on a typical UNIX file #include <sys/types.h> #include <sys/stat.h> int stat(const char *path, struct stat *buf); – – – – Determine whether file *path exists. Determine whether the file is executable. Other meta-information, such as access time, etc. check out what you can do with ‘utime’. // example3.cpp int check_executable(char *filename) { struct stat buf; int j = stat(filename, &buf); if (j == (-1)) return FILE_NOT_EXIST; if (buf.st_mode & 0111) return EXECUTABLE; return NOT_EXECUTABLE; }