当前位置: 技术问答>linux和unix
大家共同探讨
来源: 互联网 发布时间:2014-12-01
本文导语: 客户与服务器通信例子: $/etc/mknod Public p $chmod 664 Public 文件comm.h: #define PUBLIC "Public" //定义公共命名管道名称; struct message { char pipe[20]; //私有命名管道名称 char filename[256]; //检...
客户与服务器通信例子:
$/etc/mknod Public p
$chmod 664 Public
文件comm.h:
#define PUBLIC "Public" //定义公共命名管道名称;
struct message
{
char pipe[20]; //私有命名管道名称
char filename[256]; //检索文件名称
}
文件client.c:
#include
#include
#include
#include"comm.h" //这是一个头文件
mian(argc,argv)
int argc;
char *argv[];
{
int pubfd,prifd;
char buffer[256];
int num;
struct message mesg;
# 客户程序以请求的文件名作为参数
if (argc!=2)
{
fprintf(stderr,"Usage:client[filename]n");
exit(1);
}
#创建私有命名管道,管道名称为“private”
strcpy(mesg.pipe."Private");
if (mknod(mesg.pipe,S_IFIFO|0666,0)==-1)
{
perror("mknod");
exit(1);
}
#客户以只写方式打开公共命名管道
if (pubfd=open(PUBLIC,O_WRONLY)==-1)
{
perror("open");
exit(2);
}
#将客户创建的私有命名管道名称和检索文件名称写到公共命名管道中
strcpy(mesg.filename,argv[1]);
write(pubfd,&mesg,sizeof(mesg));
if (prifd=open(PRIVATE,O_RDONLY)==-1)
{
perror("open");
exit(2);
}
#从私有命名管道中读取服务器返回的数据
whlie((num=read(prifd,&buffer,sizeof(buffer)))>0)
write(1,buffer,num);
close(prifd);
close(pubfd);
unlink(mesg.pipe);
exit(0);
}
文件public.c:
#include
#include
#include"comm.h"
main(argc,argv)
int argc;
char *argv[];
{
int pubfd,prifd,fd;
char buffer[256];
int num;
#服务器以只读方式打开公共命名管道
if (pubfd=open(PUBLIC,O_RDONLY)==-1)
{
perror("open");
exit(2);
}
#服务器循环等待客户请求
while(1)
{
#读取客户请求的文件名称
if (read(pubfd,&mesg.sizeof(mesg))>0)
{
#打开文件
if (fd=open(mesg.filename,O_RDONLY)==-1)
{
perror("open");
exit(1);
}
#打开私有通道名称
if(prifd=open(mesg.pipe,O_WRONLY)==-1)
{
perror("open");
exit(1);
}
#从服务器文件中读取数据,并将读取的数据写到私有管道中,发给客户进程
while ((num=read(fd,buffer,sizeof(buffer))>0)
write(prifd,buffer,num);
close(fd);
close(prifd);
}
}
close(pubfd);
}
请问:
1。为什么主函数main的括弧中会有argc和argv?
2。在不同的地方用的exit(0),exit(1),exit(2)是什么作用?能不能互相替换?
3。谁如果有对这个程序有更好的理解,请你发表自己的看法。
$/etc/mknod Public p
$chmod 664 Public
文件comm.h:
#define PUBLIC "Public" //定义公共命名管道名称;
struct message
{
char pipe[20]; //私有命名管道名称
char filename[256]; //检索文件名称
}
文件client.c:
#include
#include
#include
#include"comm.h" //这是一个头文件
mian(argc,argv)
int argc;
char *argv[];
{
int pubfd,prifd;
char buffer[256];
int num;
struct message mesg;
# 客户程序以请求的文件名作为参数
if (argc!=2)
{
fprintf(stderr,"Usage:client[filename]n");
exit(1);
}
#创建私有命名管道,管道名称为“private”
strcpy(mesg.pipe."Private");
if (mknod(mesg.pipe,S_IFIFO|0666,0)==-1)
{
perror("mknod");
exit(1);
}
#客户以只写方式打开公共命名管道
if (pubfd=open(PUBLIC,O_WRONLY)==-1)
{
perror("open");
exit(2);
}
#将客户创建的私有命名管道名称和检索文件名称写到公共命名管道中
strcpy(mesg.filename,argv[1]);
write(pubfd,&mesg,sizeof(mesg));
if (prifd=open(PRIVATE,O_RDONLY)==-1)
{
perror("open");
exit(2);
}
#从私有命名管道中读取服务器返回的数据
whlie((num=read(prifd,&buffer,sizeof(buffer)))>0)
write(1,buffer,num);
close(prifd);
close(pubfd);
unlink(mesg.pipe);
exit(0);
}
文件public.c:
#include
#include
#include"comm.h"
main(argc,argv)
int argc;
char *argv[];
{
int pubfd,prifd,fd;
char buffer[256];
int num;
#服务器以只读方式打开公共命名管道
if (pubfd=open(PUBLIC,O_RDONLY)==-1)
{
perror("open");
exit(2);
}
#服务器循环等待客户请求
while(1)
{
#读取客户请求的文件名称
if (read(pubfd,&mesg.sizeof(mesg))>0)
{
#打开文件
if (fd=open(mesg.filename,O_RDONLY)==-1)
{
perror("open");
exit(1);
}
#打开私有通道名称
if(prifd=open(mesg.pipe,O_WRONLY)==-1)
{
perror("open");
exit(1);
}
#从服务器文件中读取数据,并将读取的数据写到私有管道中,发给客户进程
while ((num=read(fd,buffer,sizeof(buffer))>0)
write(prifd,buffer,num);
close(fd);
close(prifd);
}
}
close(pubfd);
}
请问:
1。为什么主函数main的括弧中会有argc和argv?
2。在不同的地方用的exit(0),exit(1),exit(2)是什么作用?能不能互相替换?
3。谁如果有对这个程序有更好的理解,请你发表自己的看法。
|
1.argc是你的程序编译以后生成的可执行文件在执行时可以带的参数数,如:
a.out xx xx xx这时,argc是3
argv是字符串指针,也就是上例中的xx xx xx,这两个都是有系统传给程序的。
a.out xx xx xx这时,argc是3
argv是字符串指针,也就是上例中的xx xx xx,这两个都是有系统传给程序的。
|
1.argc是命令行参数的个数,argv[]中保存着你的命令行参数的值,如果一些参数要通过命令行来传递,则需要加argc,argv,如果没有,加上也不会报错。
2.exit()作用是退出程序,把控制权返回给操作系统。0,1,2只是传给系统的状态值,一般约定0是代表成功,一般非0代表失败。
3.这个程序就是客户端通过管道向服务端发出读文件的请求,服务端收到后,再通过管道把客户端请求的文件内容传递给客户端。
2.exit()作用是退出程序,把控制权返回给操作系统。0,1,2只是传给系统的状态值,一般约定0是代表成功,一般非0代表失败。
3.这个程序就是客户端通过管道向服务端发出读文件的请求,服务端收到后,再通过管道把客户端请求的文件内容传递给客户端。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。