The Linux Programming Interface

(nextflipdebug5) #1
Pipes and FIFOs 915

if (argc > 1 && strcmp(argv[1], "--help") == 0)
usageErr("%s [seq-len...]\n", argv[0]);

/* Create our FIFO (before sending request, to avoid a race) */

umask(0); /* So we get the permissions we want */
w snprintf(clientFifo, CLIENT_FIFO_NAME_LEN, CLIENT_FIFO_TEMPLATE,
(long) getpid());
if (mkfifo(clientFifo, S_IRUSR | S_IWUSR | S_IWGRP) == -1
&& errno != EEXIST)
errExit("mkfifo %s", clientFifo);

e if (atexit(removeFifo) != 0)
errExit("atexit");

/* Construct request message, open server FIFO, and send request */

r req.pid = getpid();
req.seqLen = (argc > 1)? getInt(argv[1], GN_GT_0, "seq-len") : 1;

t serverFd = open(SERVER_FIFO, O_WRONLY);
if (serverFd == -1)
errExit("open %s", SERVER_FIFO);

y if (write(serverFd, &req, sizeof(struct request)) !=
sizeof(struct request))
fatal("Can't write to server");

/* Open our FIFO, read and display response */

u clientFd = open(clientFifo, O_RDONLY);
if (clientFd == -1)
errExit("open %s", clientFifo);

i if (read(clientFd, &resp, sizeof(struct response))
!= sizeof(struct response))
fatal("Can't read response from server");

printf("%d\n", resp.seqNum);
exit(EXIT_SUCCESS);
}
–––––––––––––––––––––––––––––––––––––––––––––––– pipes/fifo_seqnum_client.c

44.9 Nonblocking I/O


As noted earlier, when a process opens one end of a FIFO, it blocks if the other end
of the FIFO has not yet been opened. Sometimes, it is desirable not to block, and
for this purpose, the O_NONBLOCK flag can be specified when calling open():

fd = open("fifopath", O_RDONLY | O_NONBLOCK);
if (fd == -1)
errExit("open");
Free download pdf