THE I/O PROCESSING
One of the ways to classify the Unix I/O is to think of it as buffered or unbuffered.The Unbuffered I/O has following path of data flow:
Data->Kernel Buffer->Disk |
Most of the system calls like: read, write, open, gets,puts, close are unbuffered.
The buffered I/O has following path of data flow:
Data->User Buffer -> Kernel Buffer -> Disk |
The standard I/O are usually buffered: fread,fwrite, fopen fclose,getchar,putchar.
Please note that : STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO are file descriptors whose type is 'int' and they are system calls themselves.
Please note that : stdin, stdout and stderr are standard I/O and they are pointers of type FILE*.
USING UNBUFFERED I/O
In this section we are going to encounter following functions:
read(2) write(2) perror(3) exit(3) |
Before going ahead and creating a program, let us have a brief look at the information from man pages. Here is what we have for read function:
man 2 read Library: #include <unistd.h > Prototype: ssize_t read(int fd, const void *buf, size_t count); Description: attempts to read up to count bytes from file descriptor fd into the buffer starting at buf. Notes: 0. If count=0, then zero is returned and no other effects. 1. Commences at current file offset. 2. If offset is past end of file, nothing read, zero returned 3. If count > SSIZE_MAX, result unspecified. Return: On Success: number of bytes read. On Error: returns -1, set 'errno' |
Now we shall look at the function perror(3):
Library: #include <stdio.h> #include <errno.h> Prototype: void perror(const char *s); escription: produces a message on the standard error output, describing the last error encountered during a call to a system or library function Return: On Success: number of bytes returned. On Error: returns -1, set 'errno' |
Finally we need to know about the exit call
Library: #include <stdlib.h> Prototype: void exit(int status); Description: causes normal process termination and the value o Return: no return |
Now here comes the exiting part: The actual program.
#include <unistd.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> #define BUFFERSIZE 8192 int main(int argc, char* argv[]){ /*Size of data read in single go*/ int numRead; /*Buffer to store the data read in one go*/ char buffer[8192]; /*attempt a first read from STDIN_FILENO*/ numRead = read ( STDIN_FILENO, buffer, BUFFERSIZE ); while(numRead>0){ /*Write numBytes bytes into the stdout*/ int numWrite = write (STDIN_FILENO, buffer, numRead); /*Check if all the bytes sent to write, got written*/ if(numRead != numWrite){ perror("Error while writing"); exit(1); } /*Write the next record.*/ numRead = read ( STDIN_FILENO, buffer, BUFFERSIZE ); } /*If we see a negative value of numRead, its error*/ if(numRead<0){ perror("Error while reading"); exit(2); } /*If you manage to reach here, exit normally*/ exit(0); } |
USING BUFFERED I/0
In this program we shall use buffered I/O methods to do what we did in last program. Here are the functions that we gonna use:
fgetc(3) fputc(3) ferror(3) perror(3) exit(3) |
So we start with man information on fgetc:
Library: #include <stdio.h> Prototype: void fgetc(FILE *stream); Description: reads the next character from stream. Returns: returns the caharacter read as an unsigned char cast to an int, or EOF on end of file or error. |
And here is a bit on fputc:
Library: #include <stdio.h> Prototype: void fputc(FILE *stream); Description: writes the character c, to stream. Returns: nothing |
and finally we need to talk about ferror:
Library: #include |
And now we are ready to have a look at our program:
#include <stdio.h> #include <errno.h> #include <stdlib.h> #define BUFFERSIZE 8192 int main(int argc, char* argv[]){ char datum; /*variable to hold the data*/ /*Attempt a first read from stdin*/ datum = fgetc (stdin); while(datum != EOF){ /*Write the datum into stdout*/ if(fputc(datum, stdout)==EOF){ perror("Error while trying to write: fputc"); exit(1); } /*Read the next record.*/ datum = fgetc (stdin); } /*If a stdin error brought you here: its bad*/ if(ferror(stdin)){ perror("Error while reading: fgetc"); exit(2); } /*If you manage to reach here, exit normally*/ exit(0); } |
No comments:
Post a Comment