7

私は2つのスレッドを作成しました.1つは読む必要があり、もう1つは書く必要があります。しかし、私は未定義の動作をします.1行、時には1000行を読むことができます.それは私にはあまり意味がありません.

私がすることは次のとおりです。 1. main.cpp で mkfifo() を使用して fifo を作成します。 2. 2 つのスレッドを開始します。1 つは読み取り、もう 1 つは書き込みです。リーダー.cpp、ライター.cpp

これらのスレッドでは、すべてのループで fifo を開いて閉じます。これは、ループの外で一度だけ行うと機能しないためです。これも奇妙です。

私は良い例を探していましたが、何も見つかりませんでした。

私の質問は簡単です。fifo (リーダー) が着信データを待機し、利用可能になったときにそれを読み取るにはどうすればよいですか。4Mhzで動作できるはずです。

これは私がこれに頭を悩ませている3日目なので、誰かが私を助けてくれることを願っています. 問題がある場合は、Qt 4.8 を使用しています。

編集:私は私の問題の解決策を見つけました:

main.cpp

#include <QtCore/QCoreApplication>
#include "reader.h"
#include "writer.h"
#include <sys/types.h>  // mkfifo
#include <sys/stat.h>   // mkfifo
#include <fcntl.h>

int main(int argc, char *argv[]) {

    QCoreApplication a(argc, argv);

    int fifo = mkfifo("/tmp/fifo", S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH);

    Reader r;
    Writer w;
    r.start();
    w.start();

    return a.exec();
}

ライター.h

#ifndef WRITER_H
#define WRITER_H

#include <QThread>
#include <stdio.h>
#include <iostream>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

class Writer : public QThread {

    Q_OBJECT

public:
    explicit Writer(QObject *parent = 0);

private:
    void run();

};

#endif // WRITER_H

リーダー.h

#ifndef READER_H
#define READER_H

#include <QThread>
#include <stdio.h>
#include <iostream>
#include <errno.h>
#include <string.h>
#include <fcntl.h>

class Reader : public QThread {

    Q_OBJECT

public:
    explicit Reader(QObject *parent = 0);

private:
    void run();

};

#endif // READER_H

ライター.cpp

#include "writer.h"

char * phrase = "Stuff this in your pipe and smoke it\n";

using namespace std;

Writer::Writer(QObject *parent) : QThread(parent) {}

void Writer::run() {

    int num, fifo;
    if ((fifo = open("/tmp/fifo", O_WRONLY)) < 0) {
       printf("%s\n", strerror(errno));
       return;
    }
    while (true) {

        if ((num= write(fifo, phrase, strlen(phrase)+1)) < 0) {
            printf("ERROR: %s\n", strerror(errno));
        }
    }
    close(fifo);

}

リーダー.cpp

#include "reader.h"

using namespace std;

Reader::Reader(QObject *parent) : QThread(parent) {}

void Reader::run() {

    int num, fifo;
    char temp[38];
    if ((fifo = open("/tmp/fifo", O_RDONLY)) < 0) {
        printf("%s\n", strerror(errno));
        return;
    }
    while (true) {
        if ((num = read(fifo, temp, sizeof(temp))) < 0) {
            printf("%s\n", strerror(errno));
        }
        printf("In FIFO is %d %s \n", num, temp);
    }
    close(fifo);
}
4

2 に答える 2

4

基本的な read() および write() 関数は、利用可能なすべてのデータの読み取りまたは書き込みを約束するものではありません。

次のようなものが必要です:

int tot = 0;
while (tot < sizeof(temp))
{
    num = read(fifo, temp + tot, sizeof(temp) - tot);
    if (num < 0)
        break;
    tot += num;
}

書き込みも同様です。

于 2012-09-25T12:06:52.590 に答える
1

単一のパイプを定期的に開閉すると、同じ問題が発生しました。パイプの再作成 (リーダー プロセスで、EOF に達したとき) が解決策になります。

于 2012-09-25T12:19:09.670 に答える