проблема с pipe

Тема в разделе "WASM.WIN32", создана пользователем jawbreaker, 9 мар 2009.

  1. jawbreaker

    jawbreaker New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    6
    Хочу создать прогу, у которой будет два процесса:
    • Первый процесс источник (source) – он должен читать информацию из файла и записывать ее в канал;
    • Второй процесс приемник (sink) – получает информацию из канала и записывает ее во второй файл.
    Главная программа:
    Код (Text):
    1. #include <windows.h>
    2. #include <iostream>
    3.  
    4. using namespace std;
    5.  
    6.  
    7. HANDLE Reader, Writer;
    8.  
    9. int main()
    10. {
    11.     SECURITY_ATTRIBUTES pipeSA;
    12.     STARTUPINFO scrStartInfo, sinkStartInfo;
    13.     PROCESS_INFORMATION scrProcessInfo, sinkProcessInfo;
    14.     pipeSA.nLength = sizeof(SECURITY_ATTRIBUTES);
    15.     pipeSA.bInheritHandle = TRUE;
    16.     pipeSA.lpSecurityDescriptor = NULL;
    17.    
    18.     if(!CreatePipe(&Reader, &Writer, &pipeSA, 0))
    19.     {
    20.         DWORD dwError = GetLastError();
    21.         HANDLE hlocal;
    22.         BOOL fok = FormatMessage(
    23.             FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
    24.             NULL,
    25.             dwError,
    26.             MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
    27.             (LPTSTR)&hlocal,
    28.             0,
    29.             NULL);
    30.  
    31.         cout << (PCTSTR)hlocal << "\n";
    32.         cin.get();
    33.  
    34.         ExitProcess(1);
    35.     }
    36.  
    37.     memset(&scrStartInfo,0,sizeof(STARTUPINFO));
    38.     scrStartInfo.cb = sizeof(STARTUPINFO);
    39.     scrStartInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    40.     scrStartInfo.hStdOutput = Writer;
    41.     scrStartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    42.     scrStartInfo.dwFlags = STARTF_USESTDHANDLES;
    43.  
    44.     if(!CreateProcess(NULL, "wpipe.exe", &pipeSA, NULL, NULL, NULL, NULL, NULL, &scrStartInfo, &scrProcessInfo))
    45.     {
    46.             ExitProcess(1);
    47.     }
    48.  
    49.     memset(&sinkStartInfo,0,sizeof(STARTUPINFO));
    50.     sinkStartInfo.cb=sizeof(STARTUPINFO);
    51.     sinkStartInfo.hStdInput = Reader;
    52.     sinkStartInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    53.     sinkStartInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
    54.     sinkStartInfo.dwFlags = STARTF_USESTDHANDLES;
    55.  
    56.     if(!CreateProcess(NULL, "rpipe.exe", &pipeSA, NULL, NULL, NULL, NULL, NULL, &sinkStartInfo, &sinkProcessInfo))
    57.     {
    58.             ExitProcess(1);
    59.     }
    60.  
    61.     CloseHandle(Reader);
    62.     CloseHandle(Writer);
    63.  
    64.     return 0;
    65. }
    wpipe - процесс для записи в канал:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. #define BUFFSIZE 512
    5.  
    6. int main()
    7. {
    8.     HANDLE hIn;
    9.     DWORD dwBytesRead = 10;
    10.     DWORD dwBytesWritten;
    11.     BOOL Success;
    12.  
    13.     hIn = CreateFile("input.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    14.     if (hIn == INVALID_HANDLE_VALUE)
    15.     {
    16.         printf ("CreateFile failed with error %d.\n",
    17.             GetLastError());
    18.         return (1);
    19.     }
    20.  
    21.     char buffer[512];
    22.    
    23.     HANDLE hWrite = GetStdHandle(STD_OUTPUT_HANDLE);
    24.  
    25.     for (;;)
    26.     {
    27.         Success = ReadFile(hIn, buffer, BUFFSIZE, &dwBytesRead, NULL);
    28.         if(! Success)
    29.         return 0;
    30.         Success = WriteFile(hWrite, buffer, dwBytesRead, &dwBytesWritten, NULL);
    31.         if(! Success)
    32.         return 0;
    33.     }
    34.     return 0;
    35. }
    и rpipe - процесс для чтения из канала:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. #define BUFFSIZE 512
    5.  
    6. int main()
    7. {
    8.     HANDLE hOut;
    9.     DWORD dwBytesRead = 10;
    10.     DWORD dwBytesWritten;
    11.     BOOL Success;
    12.  
    13.     hOut = CreateFile("output.txt", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    14.     if (hOut == INVALID_HANDLE_VALUE)
    15.     {
    16.         printf ("CreateFile failed with error %d.\n",GetLastError());
    17.         return (1);
    18.     }
    19.  
    20.     char buffer[512];
    21.    
    22.     HANDLE hRead = GetStdHandle(STD_INPUT_HANDLE);
    23.  
    24.     for (;;)
    25.     {
    26.         Success = ReadFile(hRead, buffer, BUFFSIZE, &dwBytesRead, NULL);
    27.        
    28.         if(! Success)
    29.         return 0;
    30.         Success = WriteFile(hOut, buffer, dwBytesRead, &dwBytesWritten, NULL);
    31.         if(! Success)
    32.         return 0;
    33.     }
    34.     return 0;
    35. }
    при этом создаётся просто пустой output.txt. Помогите пожалуйста найти ошибку!
    ЗЫ а есть что-нибудь посчитать про пайпы кроме msdn?
     
  2. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Вы пробовали обратиться к шаманам?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Для наследования std-хэндлов в CreateProcess д.б. установлен флаг bInheritHandles=TRUE