---
name: "io_uring_for_each_cqe"
section: "3"
platform: "linux"
package: "liburing"
version: "2.15-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/io_uring_for_each_cqe"
---

# io\_uring\_for\_each\_cqe(3)

iterate pending completion events

## NAME

io\_uring\_for\_each\_cqe - iterate pending completion events

## SYNOPSIS

```
#include <liburing.h>
```

**io\_uring\_for\_each\_cqe(struct io\_uring \****ring***,**                       **unsigned** *head***,**                       **struct io\_uring\_cqe \****cqe***) { }**

## DESCRIPTION

The [**io\_uring\_for\_each\_cqe**(3)](/io_uring_for_each_cqe/3.md) is a macro helper that iterates completion events belonging to the *ring* using *head* as a temporary iterator, and points *cqe* to each pending event when iterating.

This helper provides an efficient way to iterate all pending events in the ring, and then advancing the CQ ring by calling [**io\_uring\_cq\_advance**(3)](/io_uring_cq_advance/3.md) with the number of CQEs consumed when done. As updating the kernel visible CQ ring state involves an ordered write, doing it once for a number of events is more efficient than handling each completion separately and calling [**io\_uring\_cqe\_seen**(3)](/io_uring_cqe_seen/3.md) for each of them.

## EXAMPLE

```
void handle_cqes(struct io_uring *ring)
{
	struct io_uring_cqe *cqe;
	unsigned head;
	unsigned i = 0;
	io_uring_for_each_cqe(ring, head, cqe) {
		/* handle completion */
		printf("cqe: %d\n", cqe->res);
		i++;
	}
	io_uring_cq_advance(ring, i);
}
```

## RETURN VALUE

None

## SEE ALSO

[**io\_uring\_wait\_cqe\_timeout**(3)](/io_uring_wait_cqe_timeout/3.md), [**io\_uring\_wait\_cqe**(3)](/io_uring_wait_cqe/3.md), [**io\_uring\_wait\_cqes**(3)](/io_uring_wait_cqes/3.md), [**io\_uring\_cqe\_seen**(3)](/io_uring_cqe_seen/3.md), [**io\_uring\_buf\_ring\_cq\_advance**(3)](/io_uring_buf_ring_cq_advance/3.md)
