gcc 4.6.0 c89 我有客户端服务器应用程序的类型.服务器在事件循环中的一些代码将等待客户端的事件. 这不是将使用UDP / TCP套接字的客户端服务器.但客户端和服务器将在同一台linux机器上
gcc 4.6.0 c89
我有客户端服务器应用程序的类型.服务器在事件循环中的一些代码将等待客户端的事件.
这不是将使用UDP / TCP套接字的客户端服务器.但客户端和服务器将在同一台linux机器上运行.我想是像app1一样在同一个服务器上运行的app2.
我知道我需要使用函数指针(回调),我需要在客户端应用程序中注册回调.服务器将等待来自客户端的事件并相应地执行.
所以我在服务器上的设计就是这样的:
while(running) {
switch(event) {
case START_SDL:
/* DO something */
break;
case DELETE_EDL:
/* Do something */
break;
}
}
这样,服务器正在循环中运行,等待从客户端接收事件.但是,我不知道如何开始.
非常感谢任何建议,
您应该使用等待主线程的事件的工作线程并处理它们.这是一个很长的答案,为避免使用更长时间,我将忽略错误检查,尽管它是针对 the sixth commandment.任务结构和队列
创建一个指定任务的结构.我将使用通用的get_task和push_task函数.在一个真正的例子中,应该使用线程安全的任务队列,但是这将无效地使答案复杂化.我只是从我奠定的旧计划中勾勒出来.
struct task {
/* function callback */
void (*fun)(void *);
/* parameter to pass to callback */
void *arg;
};
同步
使用互斥体来保护任务队列和信号量来发出信号,需要完成工作.请看我上面写的粗体字.
/* this has to be initialized in main */ sem_t sem; pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
工作职能
工作人员的功能简单地等待,并在执行任务时被告知.
static void *worker(void *arg)
{
struct task t;
/* detach */
pthread_detach(pthread_self());
/* loop forever */
while (1) {
/* block until we have work to do */
sem_wait(&sem);
/* we've got work to do */
pthread_mutex_lock(&mtx);
/* get the task */
t = get_task();
pthread_mutex_unlock(&mtx);
/* we are safe now, nobody can touch t */
/* execute the callback - here is your function pointer*/
(*t.fun)(t.arg);
}
return NULL;
}
主要功能
主要功能的作用是初始化东西并推送任务.
pthread_t t1;
/* initialize unnamed semaphore */
sem_init(&sem, 0, 0);
/* start worker thread */
if (0 != pthread_create(&t1, NULL, worker, NULL)) {
perror("pthread_create");
exit(1);
}
推动任务
在这一点上,工作线程正在等待您可以从主机推送的任务.
pthread_mutex_lock(&mtx); push_task(my_task); pthread_mutex_unlock(&mtx);
该服务器如何知道客户端正在触发事件?那是为了你决定,在UNIX上有很多很多方法来做IPC.我的建议是使用消息队列.
服务器消息队列示例
#define MSGSIZE 1024
int main()
{
mqd_t mq;
struct mq_attr attr;
char message[MSGSIZE];
int read_bytes;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MSGSIZE;
mq = mq_open("/queue", O_RDWR | O_CREAT, 0700, &attr);
if ((mqd_t)-1 == mq) {
perror("mq_open");
exit(1);
}
while (1) {
/* get message from queue */
read_bytes = mq_receive(mq, message, MSGSIZE, NULL);
if (-1 == read_bytes) {
perror("mq_receive");
exit(1);
}
/* do what you wish with the message */
}
}
所以在“做你想要的”部分,你可以调用解释事件类型并将其推送给工作人员.从客户端发送消息是非常相似的,所以我不会发布(如果你真的不能做只是问).
这些都是一个大难题的(可能是破碎的)位.你的任务是将它们组装成你正在建造的任何东西.
