Postgres supports asynchronous
notification via the LISTEN and NOTIFY commands. A backend
registers its interest in a particular notification condition with
the LISTEN command (and can stop listening with the UNLISTEN
command). All backends listening on a particular condition will be
notified asynchronously when a NOTIFY of that condition name is
executed by any backend. No additional information is passed from
the notifier to the listener. Thus, typically, any actual data that
needs to be communicated is transferred through a database
relation. Commonly the condition name is the same as the associated
relation, but it is not necessary for there to be any associated
relation.

PQnotifies Returns the next
notification from a list of unhandled notification messages
received from the backend. Returns NULL if there are no pending
notifications. Once a notification is returned from PQnotifies,
it is considered handled and will be removed from the list of
notifications.

After processing a PGnotify object returned by PQnotifies, be sure to free it with free() to avoid a memory leak.

Note: In Postgres
6.4 and later, the be_pid is the
notifying backend's, whereas in earlier versions it was
always your own backend's PID.

The second sample program gives an example of the use of
asynchronous notification.

PQnotifies() does not actually read
backend data; it just returns messages previously absorbed by
another libpq function. In prior
releases of libpq, the only way to
ensure timely receipt of NOTIFY messages was to constantly submit
queries, even empty ones, and then check PQnotifies() after each PQexec(). While this still works, it is deprecated
as a waste of processing power.

A better way to check for NOTIFY messages when you have no
useful queries to make is to call PQconsumeInput(), then check PQnotifies(). You can use select(2) to wait for backend data to arrive,
thereby using no CPU power unless
there is something to do. (See PQsocket()
to obtain the file descriptor number to use with select.) Note that this will work OK whether you
submit queries with PQsendQuery/PQgetResult
or simply use PQexec. You should,
however, remember to check PQnotifies()
after each PQgetResult or PQexec, to see if any notifications came in during
the processing of the query.