我做了2个线程,一个必须读另一个必须写。但是我得到了未定义的行为,有时我可以读取 1 行,有时可以读取 1000 行。这对我来说没有多大意义。
我所做的如下: 1. 我在 main.cpp 中使用 mkfifo() 创建一个先进先出 2. 我启动 2 个线程,一个读取,另一个写入。阅读器.cpp,作家.cpp
在这些线程中,每个循环我都会打开 fifo 并关闭它,因为如果我只在循环外执行一次,它就不会工作,我觉得这也很奇怪。
我一直在寻找好的例子,但我没有找到。
我的问题很简单,我怎样才能让fifo(阅读器)等待传入数据并在可用时读取它。它应该能够以 4Mhz 运行。
我希望有人可以帮助我,因为这是我第三天在这件事上头破血流。如果我使用 Qt 4.8 很重要。
编辑:我找到了解决问题的方法:
主文件
#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);
}