#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>

/*
 * Programa exemplo de criacao de threads
 *
 * Jose Rogado
 *
 */

int file, mythread(int );

const char *msg[] = {
  "Thread #1\n", 
  "Thread #2\n", 
  "Thread #3\n", 
  "Thread #4\n"
};
#define MAXTHREADS 4

main(int argc, char *argv[])
{
   int ret, i;
   char buffer[64] = {"0"};
   pthread_t thread[MAXTHREADS];

   if (argc != 2) {
     printf("Usage %s file\n", argv[0]);
       exit(-1);
   }

   file = open (argv[1], O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
   if (file < 0) {
     perror(argv[1]);
     exit(1);
   }
   for (i = 0; i < MAXTHREADS; i++) {
     ret = pthread_create(&thread[i], NULL, (void *)(&mythread), (void *)i);
     if (ret) {
       printf("ret %d\n", ret);
       perror("thread create");
       exit(1);
     }
   }
   printf("Main Thread\n");
   for (i = 0; i < MAXTHREADS; i++)
     pthread_join(thread[i], NULL);

   lseek(file, 0, SEEK_SET); // Reset the file I/O pointer !!

   ret = read(file, buffer, sizeof(buffer));
   if (ret < 0) {
     perror("read");
     exit(1);
   }
   printf("File Content:\n%s\n", buffer);
   printf("%s\n", buffer+strlen(buffer)+1);
}

mythread(int i)
{
  int ret;

  printf("I am %s\n", msg[i]);
  ret = write(file, msg[i], strlen(msg[i]));
  if (ret < 0)
     perror("write");
}
