私は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);
}