Check file handle in C using system calls

This commit is contained in:
Fabio Scotto di Santolo
2025-06-23 17:38:46 +02:00
parent 00a33abc23
commit 85ef4163db
10 changed files with 407 additions and 0 deletions

65
chp2/select.c Normal file
View File

@@ -0,0 +1,65 @@
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#define TIMEOUT 5
#define BUF_LEN 1024
int main(void) {
struct timeval tv;
fd_set readfds;
int ret;
/* Wait on stdin for intput. */
FD_ZERO(&readfds);
FD_SET(STDIN_FILENO, &readfds);
/* Wait up to file seconds */
tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;
/* All right, now block! */
ret = select(
STDIN_FILENO + 1,
&readfds,
NULL,
NULL,
&tv
);
if (ret == -1) {
perror("select");
return 1;
} else if (!ret) {
printf("%d seconds elapsed.\n", TIMEOUT);
return 0;
}
/*
* Is our file descriptor ready to read?
* (It must be, as it was the only fd that
* we provided and the call returned
* nonzero, but we will humor ourselves.)
*/
if (FD_ISSET(STDIN_FILENO, &readfds)) {
char buf[BUF_LEN+1];
int len;
/* guaranteed to not block */
len = read(STDIN_FILENO, buf, BUF_LEN);
if (len == -1) {
perror("read");
return 1;
}
if (len) {
buf[len] = '\0';
printf("read: %s\n", buf);
}
return 0;
}
fprintf(stderr, "This should not happen!\n");
return 1;
}