Back to index

glibc  2.9
Defines | Functions | Variables
tst-aio4.c File Reference
#include <aio.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "../test-skeleton.c"

Go to the source code of this file.

Defines

#define TIMEOUT   10 /* sec */
#define SIGRTMIN   -1
#define SIGRTMAX   -1

Functions

static void sighandler (const int signo)
static int wait_flag (void)
static int do_test (int argc, char *argv[])

Variables

int my_signo
volatile sig_atomic_t flag

Define Documentation

#define SIGRTMAX   -1

Definition at line 61 of file tst-aio4.c.

#define SIGRTMIN   -1

Definition at line 60 of file tst-aio4.c.

#define TIMEOUT   10 /* sec */

Definition at line 28 of file tst-aio4.c.


Function Documentation

static int do_test ( int  argc,
char *  argv[] 
) [static]

Definition at line 65 of file tst-aio4.c.

{
  char name[] = "/tmp/aio4.XXXXXX";
  int fd;
  struct aiocb *arr[1];
  struct aiocb cb;
  static const char buf[] = "Hello World\n";
  struct aioinit init = {10, 20, 0};
  struct sigaction sa;
  struct sigevent ev;

  if (SIGRTMIN == -1)
  {
      printf ("RT signals not supported.\n");
      return 0;
  }

  /* Select a signal from the middle of the available choices... */
  my_signo = (SIGRTMAX + SIGRTMIN) / 2;

  fd = mkstemp (name);
  if (fd == -1)
    {
      printf ("cannot open temp name: %m\n");
      return 1;
    }

  unlink (name);

  /* Test also aio_init.  */
  aio_init (&init);

  arr[0] = &cb;

  cb.aio_fildes = fd;
  cb.aio_lio_opcode = LIO_WRITE;
  cb.aio_reqprio = 0;
  cb.aio_buf = (void *) buf;
  cb.aio_nbytes = sizeof (buf) - 1;
  cb.aio_offset = 0;
  cb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
  cb.aio_sigevent.sigev_notify_function = NULL;
  cb.aio_sigevent.sigev_notify_attributes = NULL;
  cb.aio_sigevent.sigev_signo = my_signo;
  cb.aio_sigevent.sigev_value.sival_ptr = NULL;

  ev.sigev_notify = SIGEV_SIGNAL;
  ev.sigev_notify_function = NULL;
  ev.sigev_notify_attributes = NULL;
  ev.sigev_signo = my_signo;

  sa.sa_handler = sighandler;
  sigemptyset (&sa.sa_mask);
  sa.sa_flags = SA_RESTART;

  if (sigaction (my_signo, &sa, NULL) < 0)
    {
      printf ("sigaction failed: %m\n");
      return 1;
    }

  flag = 0;
  /* First use aio_write.  */
  if (aio_write (arr[0]) < 0)
    {
      if (errno == ENOSYS)
       {
         puts ("no aio support in this configuration");
         return 0;
       }
      printf ("aio_write failed: %m\n");
      return 1;
    }

  if (wait_flag ())
    return 1;

  puts ("aio_write OK");

  flag = 0;
  /* Again with lio_listio.  */
  if (lio_listio (LIO_NOWAIT, arr, 1, &ev) < 0)
    {
      printf ("lio_listio failed: %m\n");
      return 1;
    }

  if (wait_flag ())
    return 1;

  puts ("all OK");

  return 0;
}

Here is the call graph for this function:

static void sighandler ( const int  signo) [static]

Definition at line 36 of file tst-aio4.c.

{
  flag = signo;
}

Here is the caller graph for this function:

static int wait_flag ( void  ) [static]

Definition at line 42 of file tst-aio4.c.

{
  while (flag == 0)
    {
      puts ("Sleeping...");
      sleep (1);
    }

  if (flag != my_signo)
    {
      printf ("signal handler received wrong signal, flag is %d\n", flag);
      return 1;
    }

  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

volatile sig_atomic_t flag

Definition at line 32 of file tst-aio4.c.

Definition at line 30 of file tst-aio4.c.