当前位置:  技术问答>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。谁如果有对这个程序有更好的理解,请你发表自己的看法。

|
1.argc是你的程序编译以后生成的可执行文件在执行时可以带的参数数,如:

  a.out xx xx xx这时,argc是3

  argv是字符串指针,也就是上例中的xx xx xx,这两个都是有系统传给程序的。

|
1.argc是命令行参数的个数,argv[]中保存着你的命令行参数的值,如果一些参数要通过命令行来传递,则需要加argc,argv,如果没有,加上也不会报错。
2.exit()作用是退出程序,把控制权返回给操作系统。0,1,2只是传给系统的状态值,一般约定0是代表成功,一般非0代表失败。
3.这个程序就是客户端通过管道向服务端发出读文件的请求,服务端收到后,再通过管道把客户端请求的文件内容传递给客户端。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 会javabean,用jbuiler的请进,呵呵,大家探讨探讨,参与者都有分!!
  • jsp/servlet开发网站,客户端打印解决方案探讨!
  • 厦门LINUX技术探讨群
  • 大家可以探讨一下Servlet的设计模式么?
  • 探讨Oracle中的&号问题
  • 大家来探讨!
  • 探讨如何学习j2ee!
  • 探讨下启动盘的制作原理!
  • 高分探讨小问题--关于jsp
  • [探讨]文件系统的控制问题
  • 欢迎高手指教,菜鸟来探讨!
  • 关于一个系统的探讨~
  • jbuilder6不稳定!请有使用经验的来探讨一下是什么原因?
  • C/C++代码格式工具探讨
  • 请教--父进程监控子进程,欢迎高手进来探讨!!!
  • 探讨下linux下pam验证中的crypt
  • 一个问题与大家探讨,各位请进,来者有分!!!
  • 关于学习Linux的一个问题(非技术的探讨)
  • makefile eval 问题--共同探讨
  • Linux Makefile探讨,产生的.d文件是.c文件的依赖?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,