我正在浏览linux启动过程的细节.据了解,主引导加载程序驻留在512字节图像(程序代码+分区表)中.510字节包括可执行代码,错误消息和分区表信息.最后2个字节包含幻数0xAA55.有人提到"神奇数字用作MBR的验证检查".现在什么是验证检查?我的猜测是像CRC这样的检查,以确保MBR没有损坏.
我在网上搜索,没有关于魔法数字及其工作的解释.但有趣的是,即使是微软操作系统,它们的启动加载器中也有魔术数字.在这方面能有人启发我们吗??????????????
虽然我没有专业的插座工作,但我发现它们很有趣.我读了理查德史蒂文斯的一些Unix网络编程的部分(我认为它是圣经,因为它被我要求的每个人推荐)但问题是这些例子需要一个通用的头文件unp.h,这是一个PIA来使用.
你们有些人可以在Unix/Linux上建议读取套接字编程吗?考虑到我是比较有经验的C/C++编码器.
到目前为止,我一直在使用gcc,g ++进行C,C++应用程序开发,并发现它非常棒.但是浏览Stack Overflow我发现许多成员声称Comeau编译器中的错误报告比任何其他编译器都要多得多.这是真的?我没有投资任何编译器的商业版本.当gcc,g ++正在做的时候,真的值得在C/C++编译器的商业版本上花钱吗?
到目前为止,我一直是C++/Linux开发人员,我擅长这个堆栈.最近我获得了需要Perl,Unix(具有C++知识,shell脚本)专业知识的机会.即使我没有太多的脚本经验可以夸耀,组织也表现出了兴趣.这个角色更多的是涉及SQL的支持,维护项目.我很晚才解决是否放弃这些优惠.
我不知道IT组织的动态,因此一方面我担心我的C++经验将无效,而且从积极的方面来说,我正在开发一个新的技术堆栈,这只会增加我的技能.
我相信,你们中的大多数人在某些时候遇到过这样的困境并且会做出一些决定.
我希望您在这样一个场景中分享您的观点,在这种情况下,一个人在改变他/她的工作时需要改变他/她的技术堆栈.
选择其中任何一个选择的优点和缺点是什么?
我也知道C++不会在不久的将来出现.perl怎么样?我不知道perl开发人员的未来是什么?是否有足够的机会让perl开发人员?
我在这里问这个问题,因为我的大多数程序员都面临着这个职业选择的困境.
编辑:自从我上次问这个问题以来,我决定转换.我正准备在虚线上签字,但是一些神圣的干预使我找到了关于工作时间的一些澄清,令我恐惧的是,这份简介要求我轮班工作,这是我从不习惯的.我更加生气,因为他们之前没有澄清这一点.这是一个知名的组织,但我仍然给了他们一点心思并且非常感谢你.
谢谢.
我正在从多个串口读取数据.目前我正在使用自定义信号处理程序(通过设置sa_handler)来比较和唤醒基于文件描述符信息的线程.我正在寻找一种方法,让单个线程具有独特的信号处理程序,在这方面我发现将使用select系统调用.
现在我有以下问题:
如果你觉得这些问题很荒谬,请不要介意.我从未使用过这种串行通信机制.
我在许多热门论坛上都提到了这个问题但没有具体的回应.我的应用程序使用串行通信与外部系统连接,每个外部系统都有自己的接口协议.从系统接收的数据显示在Qt 4.2.1中制作的GUI上.
应用程序的结构就是这样
当应用程序开始时,我们有一个登录页面,可以选择四个模块.这是作为maindisplay类实现的.四个模块中的每一个本身都是一个单独的类.这里涉及的模块是动作类,负责从各种系统收集和显示数据.
用户身份验证使他/她进入操作屏幕.动作屏幕类的构造函数执行,除了普通的初始化之外,它还启动单个系统线程,这些线程实现为单例.
每个系统协议都实现为以下形式的单例线程:
class SensorProtocol:public QThread {
static SensorProtocol* s_instance;
SensorProtocol(){}
SensorProtocol(const SensorProtocol&);
operator=(const SensorProtocol&);
public:
static SensorProtocol* getInstance();
//miscellaneous system related data to be used for
// data acquisition and processing
};
Run Code Online (Sandbox Code Playgroud)
在实现文件*.cpp中:
SensorProtocol* SensorProtocol::s_instance=0;
SensorProtocol* SensorProtocol::getInstance()
{
//DOUBLE CHECKED LOCKING PATTERN I have used singletons
// without this overrated pattern also but just fyi
if(!s_instance)
{
mutex.lock();
if(!s_instance)
s_instance=new SensorProtocol();
mutex.unlock();
}
}
Run Code Online (Sandbox Code Playgroud)
运行功能的结构
while(!mStop)
{
mutex.lock()
while(!WaitCondition.wait(&mutex,5)
{
if(mStop)
return;
}
//code to read …Run Code Online (Sandbox Code Playgroud) 我正在与以十六进制格式发送数据的外部设备连接.它是形式
> %abcdefg,+xxx.x,T,+yy.yy,T,+zz.zz,T,A*hhCRLF
Run Code Online (Sandbox Code Playgroud)
上面数据包中的每个字符都以十六进制表示形式发送(xx,yy,abcd等被实际数字替换).问题出在我的最后,我把它存储在一个const char*中,在隐式转换期间,校验和说0x05转换为\ 0x05.这里\ 0为空字符终止我的字符串.当它不是时,这被认为是不正确的帧.虽然我可以将实现更改为处理原始字节(以十六进制形式),但我只是想知道是否还有另一种方法,因为它极大地简化了字节处理.这就是程序员的意图.
另外在cutecom(在LINUX RHEL 4上)我检查了串口上的数据,我们也注意到\0x05了校验和而不是5.请注意,用于存储我正在使用的传入数据
//store data from serial here
unsigned char Buffer[SIZE];
//convert to a QString, here is where problem arises
QString str((const char*)Buffer); of \0
Run Code Online (Sandbox Code Playgroud)
QString是Qt的"字符串"克隆.库不是问题,我也可以使用STL,但C++字符串库也在做同样的事情.以前有人尝试过这种类型的实验吗?分享您的观点.
编辑
这是您可以自己检查的示例代码:
#include <iostream>
#include <string>
#include <QString>
#include <QApplication>
#include <QByteArray>
using std::cout;
using std::string;
using std::endl;
int main(int argc,char* argv[])
{
QApplication app(argc,argv);
int x = 0x05;
const char mydata[] = {
0x00, 0x00, 0x03, 0x84, 0x78, …Run Code Online (Sandbox Code Playgroud) 最近在浏览一些C++博客时,我在其中一个博客中遇到了一个小型的预告片程序.
#include<stdio.h>
int find_addr()
{
/*fill your code here*/
}
int main()
{
int i,j;
clrscr();
find_addr();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是在不触及主函数的情况下找到变量i和j的地址.我还没弄清楚.感觉很糟糕,我甚至无法解决这个小问题:((.
编辑:
上面的程序有很多非标准语句,比如使用包含conio.h和其他非标准头文件及其函数,getch()和其他语句,我匆忙编辑它并忘记从void main中省略void( ),为此道歉.
编辑2:由于我通过此处发布的回复认为存在与该问题相关的非标准问题,因此我已经投了一票来关闭此帖子.
我有一个使用串行通信与外部设备交互的应用程序.该设备的两个版本在实现上有所不同. - >一个由我的团队开发和测试 - >另一个版本由另一个团队开发.由于其他团队离开,我们的团队正在照顾它的维护.有一天,在测试应用程序时,我注意到应用程序在启动时占用了60 Mb内存,令我惊恐的是,内存使用量开始增加200Kb块,在60小时内它的内存使用量达到295 Mb,尽管响应速度没有减慢和应用程序的使用.我一次又一次地测试它,并重复相同的内存使用模式.
该应用程序是在RHEL4上的C++,Qt 4.2.1中完成的.
我使用mtrace来检查是否有任何内存泄漏,并且它没有显示出这样的泄漏.然后我使用了valgrind memcheck工具,但它提供的信息含糊不清并且不是很确定,它显示Qt的图形元素中的泄漏,在审查中可以直接拒绝.
我正在解决可以采用哪些其他工具/方法来查明这些内存泄漏的来源(如果有的话). - >另外,在更大的上下文中,我们如何在C++ Qt应用程序中检测和调试内存泄漏的存在? - >我们如何检查进程在Linux中使用了多少内存?
我曾使用gnome-system-monitor和top命令来检查应用程序使用的内存,但我听说上面提到的工具给出的结果并不是绝对的.
编辑:
我使用ccmalloc来检测内存泄漏,这是我关闭应用程序后得到的错误报告.在应用程序执行期间,没有错误消息.
| ccmalloc报告|
================================================== =====
| 总数#分配| 解除分配| 垃圾|
+ ----------- ------------- + ------------- + + --------- ---- +
| 字节| 387325257 | 386229435 | 1095822 |
+ ----------- ------------- + ------------- + + --------- ---- +
|分配| 1232496 | 1201351 | 31145 |
+ ------------------------------------------------- ---- +
| 支票数量:1 |
| 计数:2434332 |
| 检索地址的函数名称...完成.|
| 从gdb读取文件信息...完成.|
| 按照未回收的字节数排序......完成.|
| …
我必须监控串口并处理其数据.作为测试程序,我只使用了一个端口的select.运行功能如下:
void <ProtocolClass>::run()
{
int fd = mPort->GetFileDescriptor();
fd_set readfs;
int maxfd=1;
int res;
FD_ZERO(&readfs);
FD_SET(fd,&readfs);
struct timeval Timeout;
Timeout.tv_usec=0;
Timeout.tv_sec=3;
//BYTE ack_message_frame[ACKNOWLEDGE_FRAME_SIZE];
while(true)
{
usleep(10);
res=select(maxfd,&readfs,NULL,NULL,NULL);
if(res<0)
perror("\nselect failed");
else if( res==0)
puts("TIMEOUT");
else if(FD_ISSET(fd,&readfs))
{//IF INPUT RECEIVED
qDebug("************RECEIVED DATA****************");
FlushBuf();
qDebug("\nReading data into a read buffer");
int bytes_read=mPort->ReadPort(mBuf,1000);
mFrameReceived=false;
for(int i=0;i<bytes_read;i++)
{
qDebug("%x",mBuf[i]);
}
//if complete frame has been received, write the acknowledge message frame to the port.
if(bytes_read>0)
{
qDebug("\nAbout to Process Received bytes");
ProcessReceivedBytes(mBuf,bytes_read);
qDebug("\n Processed …Run Code Online (Sandbox Code Playgroud) 我有一个头文件,列出了所有的枚举(#ifndef #define #endif构造用于避免多次包含该文件),我在我的应用程序中的多个cpp文件中使用.文件中的一个枚举是
enum StatusSubsystem {ENABLED,INCORRECT_FRAME,INVALID_DATA,DISABLED};
Run Code Online (Sandbox Code Playgroud)
应用程序中有一些功能被视为
ShowStatus(const StatusSubsystem&);
Run Code Online (Sandbox Code Playgroud)
在应用程序早期我调用上面的函数时就像
ShowStatus(INCORRECT_FRAME);
Run Code Online (Sandbox Code Playgroud)
我的应用程序用于编译完美.但是在添加了一些代码后,编译停止会发出以下错误:
File.cpp:71: error: invalid conversion from `int' to `StatusSubsystem'
File.cpp:71: error: initializing argument 1 of `void Class::ShowStatus(const StatusSubsystem&)
Run Code Online (Sandbox Code Playgroud)
我检查了代码中新代码中任何冲突的枚举,看起来很好.
我的问题是编译器显示为错误的函数调用有什么问题?
供您参考,函数定义是:
void Class::ShowStatus(const StatusSubsystem& eStatus)
{
QPalette palette;
mStatus=eStatus;//store current Communication status of system
if(eStatus==DISABLED)
{
//select red color for label, if it is to be shown disabled
palette.setColor(QPalette::Window,QColor(Qt::red));
mLabel->setText("SYSTEM");
}
else if(eStatus==ENABLED)
{
//select green color for label,if it is to be shown enabled
palette.setColor(QPalette::Window,QColor(Qt::green));
mLabel->setText("SYSTEM");
}
else …Run Code Online (Sandbox Code Playgroud) 我正在编写一个涉及多个文件的示例.详细代码如下.
main.cpp中
#include <algorithm>
#include <iomanip>
#include <ios>
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>
#include "grade.h"
#include "Student_Info.h"
using std::cin;
using std::cout;
using std::domain_error;
using std::endl;
using std::max;
using std::setprecision;
using std::sort;
using std::streamsize;
using std::string;
using std::vector;
int main()
{
vector<Student_Info> students;
Student_Info record;
string::size_type maxlen = 0; //the length of the longest name
//read and store all the student's data
//Invariant: students contains all the student records read so far
//maxlen contains the length of the …Run Code Online (Sandbox Code Playgroud)