aix 如何获取标准输出设备文件名?

firmbank 2016-02-29 09:23:35
在代码中先用dup2函数对标准输出设备进行了重定向,在后续的函数中如何获取重定向后的文件名?
谢谢!
...全文
399 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
firmbank 2016-04-02
  • 打赏
  • 举报
回复
还没解决。。。。。。
赵4老师 2016-03-03
  • 打赏
  • 举报
回复
学习和使用api hook技术 ?
赵4老师 2016-03-02
  • 打赏
  • 举报
回复
自己声明一个全局字符串事先保存文件名?
firmbank 2016-03-02
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
自己声明一个全局字符串事先保存文件名?
不行,如果在一个目标程序里可以用全局变量,现在是2个不同的目标程序。 主控程序通过读取xml文件,根据xml文件的配置参数启动其他服务程序 在配置文件里配置输出日志文件名和错误日志文件名,主控程序使用dup2()函数重定向标准输出及标准错误输出, 然后用execvp()函数调用各种服务 各种服务的命令行参数不可以修改(担心修改后的风险) 现在希望通过获取标准输出设备的文件名对日志进行改造。
firmbank 2016-03-01
  • 打赏
  • 举报
回复
1楼这个不行 我的程序是在aix环境下开发的,你这是win的,很多不同。
赵4老师 2016-03-01
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"psapi")
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <psapi.h>
#include <io.h>
#define BUFSIZE 512
BOOL GetFileNameFromHandle(HANDLE hFile) {
    TCHAR pszFilename[MAX_PATH+1];
    HANDLE hFileMap;

    BOOL bSuccess = FALSE;
    DWORD dwFileSizeHi = 0;
    DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi);
    if( dwFileSizeLo == 0 && dwFileSizeHi == 0 ) {
        _tprintf(TEXT("Cannot map a file with a length of zero.\n"));
        return FALSE;
    }
    hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,1,NULL);
    if (hFileMap) {
        // Create a file mapping to get the file name.
        void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
        if (pMem) {
            if (GetMappedFileNameA (GetCurrentProcess(),pMem,pszFilename,MAX_PATH)) {
                // Translate path with device name to drive letters.
                TCHAR szTemp[BUFSIZE];
                szTemp[0] = '\0';
                if (GetLogicalDriveStrings(BUFSIZE-1, szTemp)) {
                    TCHAR szName[MAX_PATH];
                    TCHAR szDrive[3] = TEXT(" :");
                    BOOL bFound = FALSE;
                    TCHAR* p = szTemp;
                    do {
                        // Copy the drive letter to the template string
                        *szDrive = *p;
                        // Look up each device name
                        if (QueryDosDevice(szDrive, szName, MAX_PATH)) {
                            size_t uNameLen = _tcslen(szName);
                            if (uNameLen < MAX_PATH) {
                                bFound = _tcsnicmp(pszFilename, szName, uNameLen) == 0
                                      && *(pszFilename + uNameLen) == _T('\\');
                                if (bFound) {
                                    // Reconstruct pszFilename using szTempFile
                                    // Replace device path with DOS path
                                    TCHAR szTempFile[MAX_PATH];
                                    sprintf(szTempFile,
                                            TEXT("%s%s"),
                                            szDrive,
                                            pszFilename+uNameLen);
                                    strcpy(pszFilename, szTempFile);
                                }
                            }
                        }
                        // Go to the next NULL character.
                        while (*p++);
                    } while (!bFound && *p); // end of string
                }
            }
            bSuccess = TRUE;
            UnmapViewOfFile(pMem);
        }
        CloseHandle(hFileMap);
    }
    _tprintf(TEXT("File name is %s\n"), pszFilename);
    return(bSuccess);
}
int _tmain(int argc, TCHAR *argv[]) {
    FILE *f;
    HANDLE hFile;

    if( argc != 2 ) {
        _tprintf(TEXT("This sample takes a file name as a parameter.\n"));
        return 0;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) return 0;

    hFile=(HANDLE)_get_osfhandle(fileno(f));
    //  hFile = CreateFile(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        _tprintf(TEXT("CreateFile failed with %d\n"), GetLastError());
        return 0;
    }
    GetFileNameFromHandle( hFile );
    fclose(f);
    return 0;
}
//C:\test>test c:\windows\system32\kernel32.dll
//File name is C:\WINDOWS\system32\kernel32.dll
//
【激光质量检测】利用丝杆与步进电机的组合装置带动光源的移动,完成对光源使用切片法测量其光束质量的目的研究(Matlab代码实现)内容概要:本文研究了利用丝杆与步进电机的组合装置带动光源移动,结合切片法实现对激光光源光束质量的精确测量方法,并提供了基于Matlab的代码实现方案。该系统通过机械装置精确控制光源位置,采集不同截面的光强分布数据,进而分析光束的聚焦特性、发散角、光斑尺寸等关键质量参数,适用于高精度光学检测场景。研究重点在于硬件控制与图像处理算法的协同设计,实现了自动化、高重复性的光束质量评估流程。; 适合人群:具备一定光学基础知识和Matlab编程能力的科研人员或工程技术人员,尤其适合从事激光应用、光电检测、精密仪器开发等相关领域的研究生及研发工程师。; 使用场景及目标:①实现对连续或脉冲激光器输出光束的质量评估;②为激光加工、医疗激光、通信激光等应用场景提供可靠的光束分析手段;③通过Matlab仿真与实际控制对接,验证切片法测量方案的有效性与精度。; 阅读建议:建议读者结合机械控制原理与光学测量理论同步理解文档内容,重点关注步进电机控制逻辑与切片数据处理算法的衔接部分,实际应用时需校准装置并优化采样间距以提高测量精度。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧