PlainJi 2014-05-04 12:23 采纳率: 0%
浏览 901

linux系统下缓冲机制问题

刚开始接触linux系统,所问问题可能小白,还望见谅。

最近再做一个CAN转以太网的网关,也就是CAN总线收到数据,通过以太网转发出去;以太网收到数据,通过CAN总线转发出去。

硬件用的是atmel的arm9处理器,软件用的是linux操作系统。现在的进展是CAN总线和以太网的收发都已经ok了。代码如下:

void SendUp()
{
while(1)
{
CAN_Receive();
LoadMessage();
TCP_Write(UpMessageBuf,MessageLength);
}
}

void SendDown()
{
int TcpReceiveBytes=0;
while(1)
{
TcpReceiveBytes=TCP_Read(DownMessageBuf);
DownMessageBuf[TcpReceiveBytes]=0;
printf("TCP Receive %d bytes:%s\n",TcpReceiveBytes,DownMessageBuf);
CAN_Send(DownMessageBuf,TcpReceiveBytes);
}
}

用了两个线程,分别进行上行数据的转发和下行数据的转发,即等待收到数据,读取数据,转发数据;再等待接收数据……依次类推。可以看出,目前没有使用任何缓冲机制。

所以请教各位,对于我的这样一个功能,使用什么缓冲机制比较有效?另外,完成这个功能,使用线程好还是使用进程好?
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 01:09
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Linux系统中,可以使用以下几种方法来解决缓冲机制的问题:

    1. 使用信号量:你可以创建一个信号量,然后在发送或接收数据时检查信号量的状态。如果信号量为空,则表明有其他线程正在处理数据,因此不应继续发送或接收数据。这可以通过signal.h库中的信号操作符实现。

    2. 使用临界区(Locking):在发送或接收数据之前,检查当前线程是否拥有锁。如果没有,则拒绝执行,并且在后续调用中添加锁才能继续。

    3. 使用消息队列(Message Queues):可以将数据存储在一个消息队列中,然后当有一个线程准备接收数据时,从队列中取出数据并发送给它。

    4. 使用共享内存:可以为每个线程分配一个共享内存区域,并将其用于交换数据。

    5. 使用文件描述符:可以为每个线程分配一个文件描述符,并在其上打开一个流,以便它们可以在不中断其他线程的情况下写入或读取文件。

    6. 使用管道:可以将数据传递到另一个线程的管道,并在另一端接受数据。

    7. 使用互斥锁(Mutexes):可以为每个线程创建一个互斥锁,并在其上进行同步操作,例如读取或写入数据。

    8. 使用信号量和临界区结合:可以使用信号量来控制对资源的访问,并结合临界区来确保只有主线程可以访问这些资源。

    关于线程与进程的选择,取决于你的具体需求。线程更适合于并发任务,而进程则更适用于多核CPU环境下的I/O密集型任务。如果你的任务主要集中在IO操作上,那么线程可能是更好的选择。但是,如果任务的主要目的是并发计算,那么进程可能是更好的选择。

    评论

报告相同问题?