后,我们只需在服务器端应用select循环查询是否有任务,再执行相应的操作。
  服务器实现代码如下:
1#include"head.h"
2pthread_mutex_tlock;
3pthread_cond_tcond1,cond2;
4void*hand(void*arg)
5{
6pthread_detach(pthread_self());
7TASKtask;
8pQUEUEpq=(pQUEUE)arg;
9while(1)
10{
11get_task(pq,&task);
12excute_task(&task);
13sleep(1);
14}
15}
16intmain(intargc,char*argv[])
17{
18if(argc!=3)
19{
20perror("参数错误!! ");
21exit(1);
22}
23signal(SIGINT,SIG_IGN);
24signal(SIGPIPE,SIG_IGN);
25signal(SIGQUIT,SIG_IGN);
26QUEUEque;
27intfd;
28fd_setread_set,revc;
29pFDlist;
30memset(&que,0,sizeof(QUEUE));
31fd_init(&list);
32intcnt=atoi(argv[2]);
33pthread_t*arr=(pthread_t*)calloc(cnt,sizeof(pthread_t));
34pthread_mutex_init(&lock,NULL);
35pthread_cond_init(&cond1,NULL);
36pthread_cond_init(&cond2,NULL);
37intindex=0;
38while(cnt>0)
39{
40pthread_create(arr+index,NULL,hand,(void*)&que);
41cnt--;
42index++;
43}
44fd=open(argv[1],O_RDONLY);
45if(fd==-1)
46{
47perror("管道打开失败!! ");
48exit(1);
49}
50structtimevaltm;
51intret;
52FD_ZERO(&read_set);
53FD_ZERO(&revc);
54FD_SET(fd,&read_set);
55while(1)
56{
57tm.tv_sec=0;
58tm.tv_usec=1000;
59revc=read_set;
60ret=select(1024,&revc,NULL,NULL,&tm);
61if(ret==0)
62continue;
63elseif(ret>0)
64{
65if(FD_ISSET(fd,&revc))
66{
67charbuf[32];
68memset(buf,0,32);
69if(read(fd,buf,32)==0)
70continue;
71else
72{
73charname[32];
74intr_fd,w_fd;
75buf[strlen(buf)-1]='';
76memset(name,0,32);
77sprintf(name,"r.%s",buf);
78w_fd=open(name,O_WRONLY);
79memset(name,0,32);
80sprintf(name,"w.%s",buf);
81r_fd=open(name,O_RDONLY);
82fd_insert(&list,r_fd,w_fd);
83FD_SET(r_fd,&read_set);
84}
85}
86}
87pFDpcur=list;
88while(pcur)
89{
90if(FD_ISSET(pcur->s_rfd,&revc))
91{
92charbuf[1024];
93memset(buf,0,1024);
94if(read(pcur->s_rfd,buf,1024)==0)
95{
96FD_CLR(pcur->s_rfd,&read_set);
97inti=pcur->s_rfd;
98pcur=pcur->next;
99fd_del(&list,i);
100}
101else
102{
103TASKtk;
104memset(&tk,0,sizeof(TASK));
105tk.s_fd=pcur->s_wfd;
106strcpy(tk.s_msg,buf);
107add_task(&que,&tk);
108pcur=pcur->next;
109}
110}
111else
112pcur=pcur->next;
113}
114}
115pthread_mutex_destory(&lock);
116pthread_cond_destory(&cond1);
117pthread_cond_destory(&cond2);
118return0;
119}
  客户端实现代码如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <fcntl.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <sys/stat.h>
7 #include <sys/types.h>
8 int main(int argc,char *argv[])
9 {
10     int fd_server,send,revc;
11     char rname[32],wname[32];
12     memset(rname,0,32);
13     memset(wname,0,32);
14     sprintf(rname,"r.%d",getpid());
15     sprintf(wname,"w.%d",getpid());
16     mkfifo(rname,0666);
17     mkfifo(wname,0666);
18     fd_server=open(argv[1],O_WRONLY);
19     char msg[1024];
20     memset(msg,0,1024);
21     sprintf(msg,"%d ",getpid());
22     write(fd_server,msg,strlen(msg));
23     revc=open(rname,O_RDONLY);
24     send=open(wname,O_WRONLY);
25     while(memset(msg,0,1024),fgets(msg,1024,stdin))
26     {
27         write(send,msg,strlen(msg));
28         memset(msg,0,1024);
29         read(revc,msg,1024);
30         write(1,msg,strlen(msg));
31     }
32     close(fd_server);
33     close(send);
34     close(revc);
35     unlink(rname);
36     unlink(wname);
37     return 0;
38 }