#include #include #include #include #include #include #include #include typedef void sigfunc_t(int); void signal_handler(int param) { static int fd; unsigned char sig; if (fd && param==0) { close(fd); return; } if (param < 1) { fd = -param; return; } if (fd) { sig=param; while (-1 == write(fd, &sig, 1) && EINTR == errno) ; } } sigfunc_t *connect_signal(int signo, sigfunc_t *func) { struct sigaction act, oact; act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(signo, &act, &oact) < 0) return SIG_ERR; return oact.sa_handler; } int open_signal_file(void) { int fd[2]; pipe(fd); signal_handler(-fd[1]); // hand off the write side of the pipe connect_signal(SIGHUP, signal_handler); connect_signal(SIGINT, signal_handler); connect_signal(SIGXFSZ, signal_handler); return fd[0]; //return the read side of the pipe } void close_signal_file(int fd) { signal_handler(0); close(fd); } int main(void) { fd_set read_fds; char buf[256], fname[]="log.0"; int sigfd, fd, i; unsigned long long bytes_left=3ull * (1ull<<31) + 256ull; sigfd = open_signal_file(); if (!sigfd) return 1; while (bytes_left) { int len; fd = creat(fname, S_IRUSR | S_IWUSR); if (fd == -1) return 2; len = 0x7fffffff; if (len > bytes_left) len = bytes_left; ftruncate(fd, len); bytes_left -= len; if (!bytes_left) break; lseek(fd, 0, SEEK_END); i = write(fd, buf, 256); if (i>0) bytes_left -= i; if (i<0) puts("write errored"); FD_SET(sigfd, &read_fds); select(sigfd + 1, &read_fds, NULL, NULL, NULL); if (FD_ISSET(sigfd, &read_fds)) { int sigs = read(sigfd, buf, 256); if (sigs > 0) for (i=0; i