I have tried O_NONBLOCK. But write() not returning failure. Sample code is shown below
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <atomic.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <sys/ioctl.h>
#define SIZE (800 * 1024 * 1024)
void handler(void)
{
printf(“in handler\n”);
}
int main(int argc, char *argv[])
{
long long unsigned int s32_ret_sts;
char* pu8_write_buff;
int s32_desc = -1;
int s32_ret_val = 0;
int i;
struct sigaction t_action; /* Signal structure */
memset(&t_action, 0, sizeof(struct sigaction));
t_action.sa_flags = SA_SIGINFO;
t_action.sa_handler = &handler;
s32_ret_val |= sigaction(SIGHUP, &t_action, NULL); /* hangup */
s32_ret_val |= sigaction(SIGINT, &t_action, NULL); /* interrupt */
s32_ret_val |= sigaction(SIGQUIT, &t_action, NULL); /* quit */
s32_ret_val |= sigaction(SIGILL, &t_action, NULL); /* illegal instruction */
s32_ret_val |= sigaction(SIGTRAP, &t_action, NULL); /* trace trap */
s32_ret_val |= sigaction(SIGIOT, &t_action, NULL); /* IOT instruction */
s32_ret_val |= sigaction(SIGABRT, &t_action, NULL); /* Used by abort() function */
s32_ret_val |= sigaction(SIGFPE, &t_action, NULL); /* EMT instruction */
s32_ret_val |= sigaction(SIGBUS, &t_action, NULL); /* Bus error */
s32_ret_val |= sigaction(SIGSEGV, &t_action, NULL); /* Segmentation violation */
s32_ret_val |= sigaction(SIGSYS, &t_action, NULL); /* Bad argument to system call */
s32_ret_val |= sigaction(SIGPIPE, &t_action, NULL); /* Write on pipe with no reader */
s32_ret_val |= sigaction(SIGALRM, &t_action, NULL); /* Real-time alarm clock */
s32_ret_val |= sigaction(SIGTERM, &t_action, NULL); /* Software termination signal from kill */
s32_ret_val |= sigaction(SIGPWR, &t_action, NULL); /* Power-fail restart */
s32_ret_val |= sigaction(SIGPOLL, &t_action, NULL); /* System V name for SIGIO */
s32_ret_val |= sigaction(SIGVTALRM, &t_action, NULL); /* Virtual timer expired */
s32_ret_val |= sigaction(SIGXCPU, &t_action, NULL); /* Exceeded CPU limit */
s32_ret_val |= sigaction(SIGXFSZ, &t_action, NULL); /* Exceeded file size limit */
s32_ret_val |= sigaction(SIGUSR1, &t_action, NULL); /* User-defined signal 2 */
s32_ret_val |= sigaction(SIGUSR2, &t_action, NULL); /* User-defined signal 2 */
s32_ret_val |= sigaction(SIGRTMIN, &t_action, NULL); /* User-defined signal - real-time */
pu8_write_buff = malloc(SIZE);
for (i = 0; i < 10; i++)
{
s32_desc = open64("/dev/hd0", O_WRONLY | O_NONBLOCK);
if (-1 != s32_desc)
{
s32_ret_sts = write(s32_desc, pu8_write_buff, SIZE);
if ((SIZE != s32_ret_sts) || (-1 == s32_ret_sts))
{
printf("Error %d\n", errno);
break;
}
else
{
printf("Success %llu\n", s32_ret_sts);
}
}
close(s32_desc);
}
return EXIT_SUCCESS;
}