#include #include #include #include #include #include #include #include #include #include #define USE_AIO int TEST_SIGNAL; char *buffer; int fd; pthread_t thread; #ifndef USE_AIO int readFile(int fd, char* buffer, int size) { return read(fd, buffer, size); } #else int readFile(int fd, char* buffer, int size) { struct aiocb cb; struct sigevent sigevt; sigset_t set, oset; siginfo_t info; int error; cb.aio_fildes = fd; cb.aio_offset = 0; cb.aio_buf = buffer; cb.aio_nbytes = size; sigevt.sigev_notify = SIGEV_SIGNAL; sigevt.sigev_signo = TEST_SIGNAL; sigevt.sigev_value = (sigval_t) 42; cb.aio_sigevent = sigevt; sigemptyset(&set); sigaddset(&set, TEST_SIGNAL); // error = sigprocmask(SIG_BLOCK, &set, &oset); error = pthread_sigmask(SIG_BLOCK, &set, &oset); if (error != 0) { perror("Error setting mainthread signal mask"); } printf("Reader pid: %d\n", getpid()); pthread_sigmask(SIG_BLOCK, NULL, &oset); // sigprocmask(SIG_BLOCK, NULL, &oset); if (sigismember(&oset, TEST_SIGNAL)) { printf("We are blocking TEST_SIGNAL\n"); } aio_read(&cb); pthread_sigmask(SIG_BLOCK, NULL, &oset); // sigprocmask(SIG_BLOCK, NULL, &oset); if (sigismember(&oset, TEST_SIGNAL)) { printf("We are still blocking TEST_SIGNAL in process %d\n", getpid()); } // sigwaitinfo(&set, &info); // printf("The magic number is: %d\n", info.si_value.sival_int); aio_return(&cb); // printf("Signalling thread\n"); // pthread_kill(thread, TEST_SIGNAL); return 1; } void* setupWaiter(void *args) { sigset_t set, oset; siginfo_t info; int error; printf("Waiter pid: %d\n", getpid()); sigemptyset(&set); sigaddset(&set, TEST_SIGNAL); error = pthread_sigmask(SIG_BLOCK, &set, &oset); if (error != 0) { perror("Error setting thread signal mask"); } pthread_sigmask(SIG_BLOCK, NULL, &oset); if (sigismember(&oset, TEST_SIGNAL)) { printf("Waiter is also bocking TEST_SIGNAL\n"); } sigwaitinfo(&set, &info); printf("The magic number is: %d\n", info.si_value.sival_int); printf("Contents: %s\n", buffer); close(fd); return 0; } #endif int main(int argc, char** argv) { void *an_answer; int size; int answer; struct stat fd_stat; TEST_SIGNAL = SIGRTMIN; printf("Argc: %d\n", argc); printf("PID: %d\n", getpid()); fd = open("test.c", O_RDONLY); answer = fstat(fd, &fd_stat); if (answer != 0) { perror("Error stating file"); } else { size = (int) fd_stat.st_size; printf("size: %d\n", size); } buffer = (char*) malloc((size+1)*sizeof(char)); #ifdef USE_AIO { pthread_attr_t attrib; pthread_attr_init(&attrib); pthread_create(&thread, &attrib, &setupWaiter, NULL); } #endif answer = readFile(fd, buffer, size); #ifndef USE_AIO printf("Contents: %s\n", buffer); close(fd); #else pthread_join(thread, &an_answer); #endif return answer; }