aio_cancel()

Updated: April 19, 2023

Cancel an asynchronous I/O operation

Synopsis:

#include <aio.h>

int aio_cancel( int fd, 
                struct aiocb * aiocbptr );

Arguments:

fd
The file descriptor for which you want to cancel asynchronous I/O requests.
aiocbptr
A pointer to an asynchronous I/O control block of type aiocb for the request you want to cancel, or NULL if you want to cancel all requests against the file descriptor.

Library:

libc

Use the -l c option to qcc to link against this library. This library is usually included automatically.

Description:

The aio_cancel() function attempts to cancel one or more asynchronous I/O requests currently outstanding against a file descriptor.

Normal asynchronous notification occurs for asynchronous I/O operations that are successfully canceled. If there are requests that can't be canceled, then the normal asynchronous completion process takes place for those requests when they're completed.

The error status that's associated with requested operations that are successfully canceled is set to ECANCELED, and the return status is -1. The aio_cancel() function doesn't modify the aiocb structures for requested operations that aren't successfully canceled.

If aiocbptr isn't NULL, aio_cancel() ignores the fd argument and attempts to cancel the I/O operation specified by the aiocb control block. The operation isn't cancelled if it's already in progress.

Returns:

AIO_CANCELED
The requested operation(s) were canceled.
AIO_NOTCANCELED
At least one of the requested operations couldn't be canceled because it was in progress.
Note: A return value of AIO_NOTCANCELED doesn't indicate the state of any other operations referenced in the call to aio_cancel(). To determine their status, use aio_error().
AIO_ALLDONE
All of the operations have already been completed.
-1
An error occurred; errno is set.

Errors:

EBADF
The fd argument isn't a valid file descriptor.
EINVAL
The control block that aiocbptr points to isn't valid (i.e., it hasn't yet been used in any call to aio_read() or aio_write()).

Classification:

POSIX 1003.1

Safety:  
Cancellation point No
Interrupt handler No
Signal handler Yes
Thread Yes

Caveats:

The first time you call an aio_* function, a thread pool is created, making your process multithreaded if it isn't already. Because of this, after a fork() the child can not use any of the aio_*() functions if the parent used any aio_*() functions before the fork(). The thread pool isn't destroyed until your process ends.