2009-04-06の記事、famao曰く [長年日記]

(TT) posix message queue

とりあえずテスト用に走り書き。もう少しまともな感じにすること。
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#include <errno.h>
#include <pthread.h>
#include <stdio.h>
#include <getopt.h>
#define MES "hogehoge"
static int _write_thread_flag = 0;
static void *
_write_thread(void *arg)
{
  mqd_t r;
  mqd_t t = *((mqd_t *)arg);
  int write_count = 0, err_count = 0;
  while(1) {
    r = mq_send(t, MES , sizeof(MES) , 0);
    if (r == (mqd_t)-1) {
      ++err_count;
    }
    if (_write_thread_flag) break;
    ++write_count;
  }
  printf("%d %d %lu\n", write_count, err_count, pthread_self());
  return NULL;
}
static int
_calc_value(const char *num, int default_val)
{
   char *endptr = 0;
   long val = strtol(num, &endptr, 10);
   if (*endptr != 0) {
       return default_val;
   }
   return val;
}
static void
_parse_option(int argc, char **argv, int *thread, int *time)
{
  int c;
  int index;
  struct option opt[] = {
    {"thread", 1, 0, 0},
    {"time", 1, 0, 1},
    {0,0,0,0}
  };
  while(1) {
    c = getopt_long(argc, argv,  "", opt, &index);
    if (c == -1) break;
    switch(c) {
      case 0:
         if (thread) *thread = _calc_value(optarg,1);
         break;
      case 1:
         if (time) *time = _calc_value(optarg, 60);
         break;
      default:
         break;
    }
  }
}
int
main(int argc, char **argv)
{
  mqd_t q;
  int i;
  pthread_t thread;
  int time = 60, num_thread = 1;
  _parse_option(argc, argv, &num_thread, &time);
  q = mq_open("/hoge", O_WRONLY | O_CREAT , 0600, 0);
  if (q == (mqd_t)-1) {
     printf("hoge %s\n", strerror(errno));
     return -1;
  }
  printf("%d %d\n", num_thread, time);
  for (i = 0; i < num_thread; ++i) {
    pthread_create(&thread, NULL, &_write_thread, &q);
  }
  sleep(time);
  _write_thread_flag = 1;
  sleep(5);
  return 0;
}
Tags: Linux
[]

トップ «前の日記(2009-03-31の記事、famao曰く) 最新 次の日記(2009-05-01の記事、famao曰く)»