Linux下c++代码fwrite处出现段错误
在windows系统下运行下面的代码可以正常运行
但到了linux下,出现段错误
通过gbd调试检测到是fwrite出现的问题(段错误提示在代码下面)
通过打断点检测也确实是fwrite将数据写入流的时候不能写入出现的段错误。
尝试了很多方法都不能解决,求助大佬
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <bits/stdc++.h>
#include <stdlib.h>
#include <GL/glut.h>
#include <ctime>
#include <unistd.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
Mat I = imread("./pic/h1.png");
int width = I.cols;
int height = I.rows;
GLubyte* pixels;
static GLfloat spin1 = 0.0;
static GLfloat move1 =0.0;
static GLfloat size1 = 1.0;
int n = 0;
FILE* pPipe = NULL;
long long lSize = 544 * 960 * 4;
int fpipe;
GLuint load_texture(const char* fileName)
{
GLuint texture_ID;
GLubyte* pixels = NULL;
Mat dst = imread(fileName, -1);
Mat img;
if (dst.channels() != 4)
{
cvtColor(dst, img, CV_BGR2BGRA);
}
if (dst.channels() == 4)
img = dst;
// if (img.empty())
// {
// fprintf(stderr, "Can not load image %s", fileName);
// return -1;
// }
int width = img.cols;
int height = img.rows;
int channel = img.channels();
int pixellength = width * height * channel;
pixels = new GLubyte[pixellength];
memcpy(pixels, img.data, pixellength *sizeof(char));
glGenTextures(1, &texture_ID);
glBindTexture(GL_TEXTURE_2D, texture_ID);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
glEnable(GL_TEXTURE_2D);
free(pixels);
return texture_ID;
}
GLubyte* SavePNG()
{
GLubyte * pPixelData = NULL;
GLint picWidth = 544;
GLint picHeight = 960;
pPixelData = new GLubyte[544 * 960 * 4];
if (pPixelData == 0)
return 0;
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, picWidth, picHeight, GL_RGBA, GL_UNSIGNED_BYTE, pPixelData);
return pPixelData;
}
void pipe(GLubyte* data)
{
cout<<"pipe start"<<endl;
fwrite(data, lSize, 1, pPipe); //出现段错误,无法向流中写入数据
cout<<"pipe end"<<endl;
fflush(pPipe);
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
GLuint image = load_texture("./pic/h1.png");
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1, 1, -1, 1, -1, 1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, image);
glTranslatef(move1, 0, 0);
glRotatef(spin1, 0, 0, 1);
glScalef(size1, size1, 1);
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5, 0.5);
glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5, -0.5);
glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5, -0.5);
glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5, 0.5);
glEnd();
glDisable(GL_TEXTURE_2D);
glutSwapBuffers();
}
void spinAndSizeDisplay()
{
n += 1;
if (spin1 < 180)
{
spin1 += 1;
if (spin1 > 180)
{
spin1 -= 180;
}
}
GLubyte * data = SavePNG();
pipe(data);
free(data);
cout<<"pipe"<<endl;
if (n > 200)
{
// close(fpipe);
pclose(pPipe);
exit(0);
}
//spin1 < -180 ? spin1 += 180 : spin1 -= 1;
//size1 > 2 ? size1 -= 2 : size1 += 0.003;
//move1 = move1 > 100 ? move1 -= 100 : move1 += 1;
glutPostRedisplay();
//sleep(0.5);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
string a = "/usr/local/ffmpeg/bin/ffmpeg -f rawvideo -vcodec rawvideo -video_size 544x960 -pixel_format rgba -itsoffset 1.5 -i - -i ./pic/db.mp4 -i ./pic/sc/sc_%3d.png -filter_complex [0:v]vflip[a];[1:v][a]overlay[b];[b][2:v]overlay -r 25 -t 14.04 -loglevel quiet -y ./pic/output.mp4";
const char* p = NULL;
p = a.c_str();
pPipe = popen(p, "wb");
// cout << "trans before"<<endl;
// fpipe = fileno(pPipe);
// cout << "trans after"<<endl;
glutInitWindowSize(width, height);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpenGL");
glutDisplayFunc(display);
glutIdleFunc(spinAndSizeDisplay);
glutMainLoop();
}
相关文章
- 分析Linux系统中错误日志的有效方法(linux错误日志)
- Linux查看错误日志:一键解决问题(linux查看错误日志)
- 高性能Linux下的GD支持力量(gd支持linux)
- 解决Linux更改密码出错问题(linux更改密码错误)
- 权限如何在Linux终端修改文件权限(linux终端修改文件)
- 解决Linux系统错误108(linux错误-108)
- 深入探讨 Linux 内部错误的原因及解决方案(linux内部错误)
- Linux实现解压RAR文件的简便指令(linux解压rar文件命令)
- 远程启动Linux系统:使用远程命令行(远程启动linux命令)
- 使用Linux系统抵御病毒侵袭(linux系统防病毒)
- Linux解析文件:新手必学技能(linux解析文件)
- 解决Linux虚拟机出现的错误(linux虚拟机错误)
- 解决Linux协议出错:一种新方法(linux协议错误)
- 调整Linux时区:上海路上走(linux上海时区)
- 内存最佳Linux虚拟机内存设置(linux虚拟机多大)
- Linux实现双机热备——实现数据永不丢失(linux实现双机热备)
- Linux的几个分支:分析、精彩见识(linux的分支)
- 开源世界:Linux的分支系统之旅(linux的分支)
- 简单易懂的Linux防火墙配置指南(linux配置防火墙命令)
- 如何在 Linux 系统中监听按键?(linux监听按键)
- Linux输入输出错误处理方案(linux输入输出错误)
- Linux段错误:如何定位与调试(linux段错误调试)
- 最新Linux系统更新:把时间拉向前端(linux更新时间)
- 嵌入式Linux系统开发流程简介(嵌入式linux流程)
- 深入浅出Linux输出命令(linux输出命令)
- 实验楼:为什么Linux成为了开发者必备的技能?(实验楼linux)
- 解读Linux服务器错误日志 快速排除故障的关键步骤(linux服务器错误日志)
- Linux解决定位段错误的技巧(linux 定位段错误)
- 界面让Linux拥有Qt完美图形界面的魅力(linux qt 图形)
- Linux系统下的验证码错误排查(验证码错误 linux)