Семафоры C ++ и использование _popen - PullRequest
3 голосов
/ 29 декабря 2011

Я пытаюсь научиться использовать семафоры и _popen.У меня есть два процесса.

 #include <windows.h>  
 #include <stdio.h>
 #include <conio.h>
 #include <string>
 #include <sstream>
 #include <iostream>
 #include <process.h>   
 #include <fstream> 
 #using <System.dll>
using namespace System;
using namespace System::Threading;
using namespace std;

Процесс один:

int main (){
FILE   *pPipe;
Semaphore^ _pool = gcnew Semaphore( 1, 1, "pool" );
Semaphore^ _eater = gcnew Semaphore(0, 1, "eater" );
char   psBuffer[128];   
if( (pPipe = _popen( "D:\gen.exe", "rt" )) == NULL )
     exit( 1 );
while(!feof( pPipe )){
        _eater->WaitOne();
        fgets( psBuffer, 128, pPipe ); 
    _pool->Release();
        cout<<psBuffer;
   }
   printf( "\nProcess returned %d\n", _pclose( pPipe ) );
} ;  

Процесс два (gen.exe):

int i=0;
Semaphore^ crt = nullptr;
crt = Semaphore::OpenExisting( "pool" );  
Semaphore^ eat = nullptr;
eat = Semaphore::OpenExisting( "eater" );                
while(true)
{
   i++;
   crt->WaitOne();
   cout<<i;
   eat->Release();
  }
}; 

Они ничего не делают.Единственный способ заставить их что-то сделать - это удалить fgets( psBuffer, 128, pPipe ); (и я не знаю, почему это так).Я хочу, чтобы они нормально работали с семафорами, я пробовал много раз, но безрезультатно :( Что не так с этими программами?

1 Ответ

2 голосов
/ 29 декабря 2011

Вы используете fgets, которая читает, пока не найдет новую строку.Но gen.exe не пишет новую строку.Измените это:

cout<<i;

на это:

cout<<i<<endl;

И все работает как положено.

...