- 论坛徽章:
- 0
|
下面开始的这个程序就有点长了,要有耐心,FIFO。
FIFO、pipo一个有名一个无名,但是真正的FIFO的优势表现在服务器可以是长期运行的进程(守护进程),而且与客户没有亲缘关系,作为服务器的首富进程以某个众所周知的路径名创建一个FIFO,并打开该FIFO来读。此后某个时刻,客户启动FIFO来写,并将其命令或者给守护进程的其他任何东西通过该FIFO发送出去,这种形式的单向通信用FIFO很容易实现,但是如果守护进程需要向客户发送回一些东西,就必须使用一些技巧了,这里进程id对与每一个进程都是唯一的,所以我们对进程id进行封包,在解析包的时候把进程id解释出来,再以该id封包,返回给客户,由于id的唯一性,我们就可以实现是双向通信了。只是我们要实现一个所谓的协议。
下面是我们的server的源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define SERV_FIFO "/tmp/serv.fifo"
ssize_t readline(int fd, void *vptr, size_t maxlen)
{
ssize_t n, rc;
char c, *ptr;
ptr = vptr;
for (n = 1; n 0) {
if (buff[n-1] == '\n')
n--; /* delete newline from readline() */
buff[n] = '\0'; /* null terminate pathname */
if ( (ptr = strchr(buff, ' ')) == NULL) {
printf("bogus request: %s\n", buff);
continue;
}
*ptr++ = 0; /* null terminate PID, ptr = pathname */
pid = atol(buff);
snprintf(fifoname, sizeof(fifoname), "/tmp/fifo.%ld", (long) pid);
if ( (writefifo = open(fifoname, O_WRONLY, 0)) 0)
write(writefifo, buff, n);
close(fd);
close(writefifo);
}
}
}
void server(int readfd,int writefd)
{
size_t len;
ssize_t n;
int fd;
char buff[MAXLINE+1];
if((n=read(readfd,buff,MAXLINE))==0)
{
printf("error in read\n");
exit(0);
}
buff[n]='\0';
if((fd= open(buff,O_RDONLY))0)
write(writefd,buff,n);
close(fd);
}
}
//END
如果您真的要copy我的程序,那么这上面的别的程序你应该也是放在同一个目录下面,如果你把文件名存为mainserver的时候,建议在编译时采取如下方式:
gcc mainsever.c -o mainserver
以下是客户端的程序:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define SERV_FIFO "/tmp/serv.fifo"
int main(int argc, char **argv)
{
int readfifo, writefifo;
size_t len;
ssize_t n;
char *ptr, fifoname[MAXLINE], buff[MAXLINE];
pid_t pid;
/* 4create FIFO with our PID as part of name */
pid = getpid();
snprintf(fifoname, sizeof(fifoname), "/tmp/fifo.%ld", (long) pid);
printf("%d",(long)pid);
if ((mkfifo(fifoname, 0666) 0)
write(STDOUT_FILENO, buff, n);
close(readfifo);
unlink(fifoname);
exit(0);
}//END
如果您把他存为mainclient,同样编译的时候通过该种方式:cc mainclient.c -o mainclent
在/tmp文件夹下面创建,abc,内容为abcasdfasdfa,创建的方式多种,vim 。。。。
命令行方式:vim abc
此时打开了一个新的页面,
abcasdfasdfa
:wq
保存.
最后一步应该是测试通过的过程了,先打开两个终端,在目标目录下:先启用服务器:./mainserver
在另外一个终端下面启动客户端:./mainclient
继续在客户端输入:/tmp/abc
得到结果:abcasdfasdfa
程序结束。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83146/showart_1335534.html |
|