目前我有一个用 C 编写的非常简单的 IRC 机器人。当我运行它时,它会建立连接并加入指定的 channel 。所有连接详细信息都是硬编码的,但这不是问题。
我想要做的是同时运行一个基本的 shell,这意味着我当前必须从 IRC channel 接收文本并解析它的循环在后台线程中运行。在这个 shell 中,我希望能够运行可以向 IRC channel 发送消息的命令,或者可以正常终止程序(意味着两个线程都需要关闭)。该 shell 并不意味着是任何类型的作业控制 shell。
该机器人的主要目的是监视 channel 中发布的任何 URL 并将其存储在 SQLite 数据库中。然后,IRC channel 中的人们将能够在数据库中搜索特定的 URL。我还希望能够从 shell 执行各种数据库命令,例如搜索,以及手动插入和删除。我提到这一点是因为我假设我需要确保所有数据库访问都是线程安全的。另外,理想情况下,我更喜欢将数据库插入优先于搜索,但这实际上是我的要求列表中的最后一个。
最后,从 IRC channel 接收到的一些命令有可能会生成到它们自己的线程中。这可能是因为他们正在访问数据库,这肯定有可能不是即时的,而且还因为他们正在调用一种方法来阻塞线程一段时间,以错开向 channel 传输消息。
这就是我要问的:
- 我该如何设置此类程序?我需要什么样的结构来同时运行两个主线程并可能在两个主线程之间传递消息?
- 对用于与 IRC channel 通信的套接字的访问是否需要线程安全?
- 我应该如何使程序线程安全?互斥体就足够了吗?
如果重要的话,该程序几乎肯定会在 Ubuntu Server 发行版上运行。
最佳答案
- 使用队列在线程之间来回传递消息(网址、命令等)。
- 仅让一个线程访问套接字。
- 如果您使用队列,则仅使用队列。
我建议首先查找并编写一个消费者/生产者程序来掌握其中的窍门,然后将其合并到您的 irc 机器人中。
关于用 C 语言为 IRC 机器人创建一个基本 shell,并在后台运行另一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13262528/