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

0

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

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

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

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

Я пытаюсь создать канал в /tmp/folder.

Я попробовал изменить 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
    Итак, вы уверены, что / tmp / fifo не находится в вашем корне / var / www / ...?
  • 0
    да, я уверен, это на самом деле в / tmp /. на самом деле, если я изменю каталог, в котором создан мой канал, я все равно не смогу открыть канал через http в моем файле php
Показать ещё 5 комментариев
Теги:
pipe

1 ответ

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
    О да! Спасибо вам большое! Я потратил так много времени, пытаясь найти правильные разрешения и т. Д., И все же это было не так! Я посмотрел на файл error.log, но все же ошибки были недостаточно ясны. Большое вам спасибо, вы спасатель :)
  • 0
    Итак, я понимаю, что error_get_last() дал вам некоторую подсказку?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню