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

firmbank 2016-02-29 09:23:35
在代码中先用dup2函数对标准输出设备进行了重定向,在后续的函数中如何获取重定向后的文件名?
谢谢!
...全文
367 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
//

3,882

社区成员

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

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