named pipe werkt niet vanuit met exec()

Status
Niet open voor verdere reacties.

dj technics

Gebruiker
Lid geworden
1 sep 2007
Berichten
367
Hi,

Ik zit met een vraagstuk omtrent een app die ik aan het bouwen ben. Eerder werd al gewezen dat de oplossing voor mij vermoedelijk in named pipes zit. Ik heb dit nu geschreven. Hier mijn code.

test.cpp
Code:
main( int argc, char* argv[] ){

	//open pipe
	int action;
	int value;
	//int pipe_out;
	char action_result[ BUFSIZ ];
	char value_result[ BUFSIZ ];

	mkfifo( FIFO_ACTION, 0666 );
	mkfifo( FIFO_VALUE, 0666 );

	//open MYSQL
	MYSQL *connect;
	connect = mysql_init(NULL);
	if(!connect){
		cout << "MySQL Initialization failed" << endl;
		return 1;
	}

	connect = mysql_real_connect( connect, "127.0.0.1", "root", "******", "projection", 0, NULL, 0 );
	if( !connect ){
		cout << "connection failed" << endl;
		return 1;
	}

	MYSQL_RES *res_set;
	MYSQL_ROW row;

	//loop variables
	bool close_loop = false;
	unsigned int i = 0;

	//char* pcCnvEnd;

	while( !close_loop ){
		
		action = open( FIFO_ACTION, O_RDONLY );
		value = open( FIFO_VALUE, O_RDONLY );
		read( action, action_result, BUFSIZ );
		read( value, value_result, BUFSIZ );

		if( strcmp( "", action_result ) != 0 ){
			if( strcmp( "ly", action_result ) == 0 ){

				char statement[512];
				snprintf(statement, 512, "SELECT `projection_lyrics_text` FROM `projection_lyrics` WHERE `projection_lyrics_id`=%s", value_result);
				mysql_query(connect, statement);
				res_set = mysql_store_result( connect );
				row = mysql_fetch_row( res_set );
				cout << row[0] << "\n" << endl;

			} else if( strcmp( "cl", action_result ) == 0 ){
				break;
			}
		}

		memset( action_result, 0, sizeof(action_result) );
		memset( value_result, 0, sizeof(value_result) );

		close( value );
		close( action );

		usleep( 5000 );
	}

	close( action );
	close( value );
	//close( pipe_out );

	unlink( FIFO_ACTION );
	unlink( FIFO_VALUE );

	cout << "Closing output" << endl;

	return 0;

}

send.cpp
Code:
int main( int argc, char* argv[] )
{
    int action;
    int value;

    /* write str to the FIFO */
    action = open( FIFO_ACTION, O_WRONLY );
    value = open( FIFO_VALUE, O_WRONLY );

    write( value, argv[ 1 ], sizeof( argv[ 1 ] ) );
    write( action, "ly", sizeof( "ly" ) );

    cout << "Sended: " << argv[ 1 ] << endl;

    close( value );
    close( action );

   /* remove the FIFO */

   return 0;
}

Dit werkt 100%. Als ik test.cpp run en dan vanuit de terminal "./send 2" uitvoer krijg ik alles zoals verwacht. Het probleem is echter dat ik in real life dit moet triggeren via php. Ik doe dus in php het volgende:

PHP:
exec( "/home/pi/Bureaublad/send $id", $output );
print_r($output);

Ik krijg als return "Sended: 14" net zoals ik dit zou uitvoeren vanuit de terminal. Mijn test.cpp geeft echter geen output terwijl dit wel werkt als ik dezelfde command uitvoer vanuit de terminal. Google maakt mij opnieuw niet veel wijzer. Ik vermoed dat dit wordt veroorzaakt doordat php een andere unix user gebruikt maar ik vind, wat ik ook probeer, geen oplossing.

Wie ooh wie kan mij verder op weg zetten?

Alvast 10.000 maal dank!!
 
Laatst bewerkt:
php heeft eigen code voor lezen en schrijven van fifo's:
zoiets bijvoorbeeld:
PHP:
            $fifo = fopen($fifoPath, 'w');

            fwrite($fifo, $data);

daarom zijn named pipes en sockets ook ideaal, want alle talen ondersteunen dit soort technologieën. En het is ook wel netjes als je dat andere topic dan eerst netjes sluit :)

Wil overigens niet zeggen dat het probleem per definitie is opgelost, want standaard staat PHP alleen writes toe op pipes waar de user van php toegang toe heeft volgens mij. Je kunt altijd even safe mode uitzetten en het dan testen.
 
Laatst bewerkt:
php heeft eigen code voor lezen en schrijven van fifo's:
zoiets bijvoorbeeld:
PHP:
$fifo = fopen($fifoPath, 'w');
fwrite($fifo, $data);

daarom zijn named pipes en sockets ook ideaal, want alle talen ondersteunen dit soort technologieën. En het is ook wel netjes als je dat andere topic dan eerst netjes sluit :)

Wil overigens niet zeggen dat het probleem per definitie is opgelost, want standaard staat PHP alleen writes toe op pipes waar de user van php toegang toe heeft volgens mij. Je kunt altijd even safe mode uitzetten en het dan testen.

Dank voor je antwoord. Ik heb dit net geprobeerd maar ook dit wil niet werken. Hier mijn code.
PHP:
$fifo_action = fopen( "/tmp/fifo_action", "w+" );
die( "first fifo fail" );
$fifo_value = fopen( "/tmp/fifo_value", "w+" );
die( "second fifo fail" );
fwrite( $fifo_value, $id );
fwrite( $fifo_action, "ly" );
fclose( $fifo_value );
fclose( $fifo_action );

Ik krijg "first fifo failed" als output. Als ik die comment krijg ik "second fifo failed". Ik heb vandaag héél wat geprobeerd. Chmod 777 op de fifo files. Chmod op "a+rw". Ook het volgende heb ik geprobeerd.
PHP:
exec( "sudo echo 'ly' > /tmp/fifo_action", $output1, $error1 );
exec( "sudo echo '2' > /tmp/fifo_value", $output2, $error2 );

Vanuit mijn temrinal werkt alles, vanuit php niets. Wat wel vreemd is, als ik mijn output app sluit en de send app run vanuit de terminal krijg ik mijn error message omdat de pipe niet open is. Exec ik diezelfde cpp file vanuit php krijg ik wel een return alsof alles goed is gegaan. Ik kan echt niet meer volgen.

Please, heeft iemand nog ideeën?
 
Wat ik ook probeerde, niets werkte totdat ik de fifo van locatie veranderde. Nu de fifo's op mijn desktop staan werkt alles vlekkeloos.

Thanks voor alle hulp!
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan