下面列出源代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <aio.h> #include <unistd.h> #include <signal.h> #include <sys/stat.h> #include <fcntl.h> static char *memBuffer; static int sFileDesc; static struct sigaction sOldSigAction; static void MySigQuitHandler(int sig) { printf("Signal Quit! The number is: %d ", sig); } static void MyFileReadCompleteProcedure(int sig, siginfo_t *si, void *ucontext) { printf("The file length is: %zu, and the content is: %s ", strlen(memBuffer), memBuffer); int status = close(sFileDesc); if(status == 0) puts("File closed successfully!"); else printf("The error code is: %d ", status); free(memBuffer); // 还原原来的SIGUSR1信号行为 if(sigaction(SIGUSR1, &sOldSigAction, NULL) == -1) puts("SIGUSR1 signal restore failed!"); } int main(void) { struct sigaction sigAction = { .sa_flags = SA_RESTART, .sa_handler = &MySigQuitHandler }; sigemptyset(&sigAction.sa_mask); if (sigaction(SIGQUIT, &sigAction, NULL) == -1) { puts("Signal failed!"); return -1; } sigAction.sa_sigaction = &MyFileReadCompleteProcedure; if(sigaction(SIGUSR1, &sigAction, &sOldSigAction) == -1) { puts("Signal failed!"); return -1; } const char *filePath = "myfile.txt"; const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; sFileDesc = open(filePath, O_RDONLY, mode); if(sFileDesc == -1) { printf("The file: %s cannot be opened! ", filePath); return -1; } const long fileLength = lseek(sFileDesc, 0, SEEK_END); lseek(sFileDesc, 0, SEEK_SET); memBuffer = malloc(fileLength + 1); memBuffer[fileLength] = '