‘action’的存储大小未知

本文记录了一次在CentOS上使用gcc编译时遇到的错误及其解决过程。主要问题是由于使用了标准C99导致编译失败,具体表现为对信号处理函数相关结构体和函数的不正确识别。关闭C99标准后,编译成功。


编译时遇到以下错误。

[root@centos-dh1 interrupt]# make
gcc -g -O2 -Wall -std=c99   -c -o interrupt.o interrupt.c
interrupt.c: 在函数‘s_catch_signals’中:
interrupt.c:33: 错误:‘action’的存储大小未知
interrupt.c:38: 警告:隐式声明函数‘sigemptyset’
interrupt.c:39: 警告:隐式声明函数‘sigaction’
interrupt.c:33: 警告:未使用的变量‘action’
make: *** [interrupt.o] 错误 1
[root@centos-dh1 interrupt]# vi Makefile
[root@centos-dh1 interrupt]#

关闭std=c99模式后就正常了。

[root@centos-dh1 interrupt]# make
gcc -g -O2 -Wall   -c -o interrupt.o interrupt.c
gcc -lzmq  interrupt.o   -o interrupt

不知道是什么原因。先记录在这里,以后有时间再想想。


#include <windows.h> #include <stdio.h> #include <tchar.h> #define MAX_BUFFER_SIZE 65536 // 文件变化类型描述 const TCHAR* GetActionDescription(DWORD action) { switch (action) { case FILE_ACTION_ADDED: return _T("添加"); case FILE_ACTION_REMOVED: return _T("删除"); case FILE_ACTION_MODIFIED: return _T("修改"); case FILE_ACTION_RENAMED_OLD_NAME: return _T("重命名(旧名)"); case FILE_ACTION_RENAMED_NEW_NAME: return _T("重命名(新名)"); default: return _T("未知操作"); } } int _tmain(int argc, TCHAR* argv[]) { if (argc != 2) { _tprintf(_T("用法: %s <监控目录>\n"), argv[0]); return 1; } // 1. 打开要监控的目录 HANDLE hDir = CreateFile( argv[1], // 监控目录路径 FILE_LIST_DIRECTORY, // 访问权限:列出目录内容 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // 共享模式 NULL, // 安全属性 OPEN_EXISTING, // 打开现有目录 FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // 目录监控专用标志 NULL ); if (hDir == INVALID_HANDLE_VALUE) { _tprintf(_T("无法打开目录。错误: %d\n"), GetLastError()); return 1; } BYTE buffer[MAX_BUFFER_SIZE]; DWORD bytesReturned; FILE_NOTIFY_INFORMATION* pNotifyInfo; TCHAR oldName[MAX_PATH] = {0}; // 用于存储重命名的旧文件名 _tprintf(_T("开始监控目录: %s (按Ctrl+C退出)\n\n"), argv[1]); // 2. 持续监控目录变化 while (TRUE) { ZeroMemory(buffer, sizeof(buffer)); // 3. 读取目录变化 BOOL success = ReadDirectoryChangesW( hDir, // 目录句柄 buffer, // 接收变化的缓冲区 sizeof(buffer), // 缓冲区大小 TRUE, // 监控子目录 FILE_NOTIFY_CHANGE_FILE_NAME | // 监控文件名更改 FILE_NOTIFY_CHANGE_DIR_NAME | // 监控目录名更改 FILE_NOTIFY_CHANGE_ATTRIBUTES | // 监控属性更改 FILE_NOTIFY_CHANGE_SIZE | // 监控文件大小更改 FILE_NOTIFY_CHANGE_LAST_WRITE, // 监控最后写入时间更改 &bytesReturned, // 返回的字节数 NULL, // 同步操作,无需OVERLAPPED NULL // 无需完成例程 ); if (!success) { _tprintf(_T("ReadDirectoryChangesW失败。错误: %d\n"), GetLastError()); break; } // 4. 处理目录变化通知 DWORD offset = 0; do { pNotifyInfo = (FILE_NOTIFY_INFORMATION*)(buffer + offset); // 将宽字符文件名转换为以null结尾的字符串 TCHAR fileName[MAX_PATH]; memcpy(fileName, pNotifyInfo->FileName, pNotifyInfo->FileNameLength); fileName[pNotifyInfo->FileNameLength / sizeof(WCHAR)] = _T('\0'); // 处理重命名事件的特殊逻辑 if (pNotifyInfo->Action == FILE_ACTION_RENAMED_OLD_NAME) { _tcscpy_s(oldName, MAX_PATH, fileName); } else if (pNotifyInfo->Action == FILE_ACTION_RENAMED_NEW_NAME) { _tprintf(_T("[事件] %s: %s -> %s\n"), GetActionDescription(pNotifyInfo->Action), oldName, fileName); } else { _tprintf(_T("[事件] %s: %s\n"), GetActionDescription(pNotifyInfo->Action), fileName); } // 移动到下一个通知 offset += pNotifyInfo->NextEntryOffset; } while (pNotifyInfo->NextEntryOffset != 0); // 直到没有下一个通知 } CloseHandle(hDir); return 0; } 代码原理和执行流程
最新发布
11-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值