Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9.  
  10. #define osErrorFatal(userMsg) osErrorFatalImpl((userMsg), __FILE__, __func__, __LINE__)
  11. #define osAssert(expr, userMsg) \
  12.     do { \
  13.         if (!(expr)) \
  14.             osErrorFatal(userMsg); \
  15.     } while(0)
  16.  
  17.    
  18. void osErrorFatalImpl(const char *userMsg, const char *fileName,
  19.                       const char *functionName, const int lineNum);
  20.  
  21. static const char *os_Usage = "Usage: ./stdio_buffering path/to/reg/file";
  22.  
  23. int main(int argc, char **argv) {
  24.     osAssert(2 == argc, os_Usage);
  25.    
  26.     /**
  27.      * Magic mesage can be controlled with setvbuf calls:
  28.      * 1) setvbuf(stdout, NULL, _IONBF, 0); -> magic message goes to stdout [no buffering is default for stderr]
  29.      * 2) setvbuf(stdout, NULL, _IOLBF, 0); -> magic message goes to file [line buffering is default for stdout]
  30.      * 3) setvbuf(stdout, NULL, _IOFBF, 0); -> magic message goes to file [full buffering is default for reg. files]
  31.      * Also, if you append new line to prinf call magic message will go to file only in case 3).
  32.      * */
  33.    
  34.     /**
  35.      * This message is not printed on stdout cause of line buffering,
  36.      * it is stored in printf's private buffer
  37.      * */
  38.     const char *magicMessage = "Magic happens to this message!";
  39.     printf("%s", magicMessage);
  40.    
  41.     /**
  42.      * Open file and redirect stdout to file
  43.      * */
  44.     int fd = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY, 0644);
  45.     osAssert(-1 != fd, "Opening file failed");
  46.    
  47.     /**
  48.      * Save a stdout fd
  49.      * */
  50.     int fdCpy = dup(STDOUT_FILENO);
  51.     osAssert(-1 != fdCpy, "Copying stdout fd failed");
  52.    
  53.     /**
  54.      * Redirect stdout to file
  55.      * */
  56.     osAssert(dup2(fd, STDOUT_FILENO), "Redirecting stdout to file failed");
  57.     printf("\nThis message will go to file along with magic message!\n");
  58.     fflush(NULL); // assure that all streams are flushed
  59.  
  60.     /**
  61.      * Restore stdout fd
  62.      * */
  63.     osAssert(-1 != dup2(fdCpy, STDOUT_FILENO), "Restoring stdout failed");
  64.    
  65.     /**
  66.      * This goes to stdout
  67.      * */
  68.     printf("Finally stdout!\n");
  69.    
  70.     return 0;
  71. }
  72.  
  73. void osErrorFatalImpl(const char *userMsg, const char *fileName,
  74.                       const char *functionName, const int lineNum) {
  75.     perror(userMsg);
  76.     fprintf(stderr, "File: '%s'\nFunction: '%s'\nLine: '%d'\n", fileName, functionName, lineNum);
  77.     exit(EXIT_FAILURE);
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement