Apache не хочет fopen или fwrite в FIFO (труба)

У меня возникла проблема с настройкой правильной связи между файлом .cpp и .html.

Итак, у меня есть три файла: один — сервер .cpp, создающий канал и блокирующий его до тех пор, пока не придет сообщение, файл открытия .php и запись чего-либо в него, а также файл .html, в котором есть только кнопка, запускающая скрипт.

Что необычно, так это то, что когда я запускаю свой сервер, а затем запускаю php-скрипт из консоли, все работает отлично, но если я хочу сделать это через браузер и html-страницу — канал не может быть открыт.

Файлы php и html помещаются в / var / www / html / catalog, а мой файл cpp находится в моей домашней папке.

Я пытаюсь создать трубу в папке / tmp /.

Я попытался изменить разрешения chmod и chown для обоих этих путей (и я знаю, что apache = www-data), но сейчас безрезультатно. У меня на 100% НЕ установлен SELinux.

Я действительно очень ценю любую помощь, я пытаюсь понять это уже несколько часов …

server.cpp

#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;

const char MSG_LENGTH = 9;
string FIFO_1 = "/tmp/fifo";

int main() {

if ( mkfifo(FIFO_1.c_str(), S_IFIFO | 0666 ) == -1 ) {
cout << "Cannot create fifo" << endl;
return 1;
}

cout << "Fifo created" << endl;

int readfd = open(FIFO_1.c_str(), O_RDONLY);
if ( readfd < 0 ) {
cout << "Cannot open fifo" << endl;
return 1;
}

char buffer[1024];
if ( read(readfd, buffer, MSG_LENGTH) < 1 ) {
cout << "Cannot read from fifo" << endl;
return 1;
}
buffer[MSG_LENGTH] = '\0';

cout << "Message: " << buffer << endl;

close(readfd);
unlink(FIFO_1.c_str());

return 0;
}

function.php

<?php

$pipe_name = '/tmp/fifo';
$msg = "message";

$pipe = fopen($pipe_name, 'w');
if ( $pipe == false)
echo "Cannot open fifo";

if ( fwrite($pipe, $msg) == false )
echo 'Cannot write to fifo';
else
echo 'Can write to fifo';

?>

0

Решение

Код, который я запускаю:

#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <string>
#include <cstring>
#include <ctime>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
using namespace std;

string FIFO_1 = "/blah/fifo";

int main() {

if ( mkfifo(FIFO_1.c_str(), S_IFIFO | 0666 ) == -1 ) {
cout << "Cannot create fifo" << endl;
//        return 1;
}
else
{
cout << "Fifo created" << endl;
}

int readfd = open(FIFO_1.c_str(), O_WRONLY);
if ( readfd < 0 ) {
cout << "Cannot open fifo" << endl;
return 1;
}

int count = 0;
for(;;)
{
count++;
cout << "Sending message " << count << endl;
time_t t = time(NULL);
string msg = ctime(&t);
if ( write(readfd, msg.c_str(), msg.length()) < 1 ) {
cout << "Cannot write to fifo" << endl;
return 1;
}
sleep(1);
}

close(readfd);
//    unlink(FIFO_1.c_str());

return 0;
}

И код PHP:

<?php

$pipe_name = '/blah/fifo';
$msg = "";

$pipe = fopen($pipe_name, 'r');
if ( $pipe == false)
{
echo "Cannot open fifo<br/>";
$err = error_get_last();
var_dump($err);
}
else
{
$count = 0;
$data = stream_get_meta_data($pipe);
var_dump($data);
echo "<br/>";
echo date("Y-M-d H:i:s") . "<br/>";
echo "Waiting for message:";
while(1)
{
$msg = fgets($pipe, 30);
$err = error_get_last();
if ($err)
{
echo "Err = "; var_dump($err); echo "<br/>";
}
else
{
echo "Got = " . $msg . "<br/>";
}
$count ++;
if ($count > 20)
{
break;
}
}
}

echo "<br/>Done...";

?>
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]