VC:va_list用法---隐含参数的使用方法

va_list用法---隐含参数的使用方法及IO使用说明

目的:
掌握VA_LIST用法
熟悉输入/出的实质,要建立起IO的概念,避免输入出停留在终端阶段

设计到IO设备,便一点设计到 阻塞、非阻塞、多路转换 信号驱动 异步控制等

 

·  阻塞I/O模型在这种模型下,若所调用的I/O函数没有完成相关的功能,则会使进程挂起,直到相关数据到达才会返回。如常见对管道设备、终端设备和网络设备进行读写时经常会出现这种情况。
·  非阻塞模型:在这种模型下,当请求的I/O操作不能完成时,则不让进程睡眠,而且立即返回。非阻塞I/O使用户可以调用不会阻塞的I/O操作,如open()write()read()。如果该操作不能完成,则会立即返回出错(例如:打不开文件)或者返回0(例如:在缓冲区中没有数据可以读取或者没空间可以写入数据)。
·  I/O多路转接模型:在这种模型下,如果请求的I/O操作阻塞,且它不是真正阻塞I/O,而是让其中的一个函数等待,在这期间,I/O还能进行其他操作。如本节要介绍的select()poll函数(),就是属于这种模型。
·  信号驱动I/O模型:在这种模型下,通过安装一个信号处理程序,系统可以自动捕获特定信号的到来,从而启动I/O。这是由内核通知用户何时可以启动一I/O操作决定的。
·  异步I/O模型:在这种模型下,当一个描述符已准备好,可以启动I/O时,进程会通知内核。现在,并不是所有的系统都支持这种模型。

 

如果设计到文件操作,需要注意 文件锁

} 文件锁包括建议性锁和强制性锁。建议性锁要求每个上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。在一般情况下,内核和系统都不使用建议性锁。强制性锁是由内核执行的锁,当一个文件被上锁进行写入操作的时候,内核将阻止其他任何文件对其进行读写操作。采用强制性锁对性能的影响很大,每次读写操作都必须检查是否有锁存在。
} Linux中,实现文件上锁的函数有lockf()fcntl(),其中lockf()用于对文件施加建议性锁,而fcntl()不仅可以施加建议性锁,还可以施加强制锁。同时,fcntl()还能对文件的某一记录上锁,也就是记录锁。
} 记录锁又可分为读取锁和写入锁,其中读取锁又称为共享锁,它能够使多个进程都能在文件的同一部分建立读取锁。而写入锁又称为排斥锁,在任何时刻只能有一个进程在文件的某个部分上建立写入锁。当然,在文件的同一部分不能同时建立读取锁和写入锁。


#include<stdio.h>
#include<stdarg.h>
int sum(int n,...)//简单求和的一个函数,n为需要求和的个数
{
 int sum=0;
 int i;
 va_list va;
 va_start(va,n);
 for(i=0;i<n;i++)
  sum+=va_arg(va,int);
 va_end(va);
 return sum;
}
int main()
{
 printf("%d/n",sum(3,1,2,3));//简单测试
 return 0;
}

vfprintf  
函数名: vfprintf   
功 能: 格式化的数据输出到指定的数据流中   
用 法: int vfprintf(FILE *stream, char *format, va_list param);   
函数说明:vfprintf()会根据参数format字符串来转换并格式化数据,然后将结果输出到参数stream指定的文件中,直到出现字符串结束(‘/0’)为止。
关于参数format字符串的格式请参 考printf()。   
返回值:成功则返回实际输出的字符数,失败则返回-1,错误原因存于errno中。

#include   
#include   
#include   
FILE *fp;   
int vfpf(char *fmt, ...)   
{   
 va_list argptr;   
 int cnt;   
 va_start(argptr, fmt);   
 cnt = vfprintf(fp, fmt, argptr);   
 va_end(argptr);   return(cnt);   
}   
int main(void)   
{   
 int inumber = 30;   
 float fnumber = 90.0;   
 char string[4] = "abc";   
 fp = tmpfile();   
 if (fp == NULL)   
 {   
  perror("tmpfile() call");   
  exit(1);   
 }   
 vfpf("%d %f %s", inumber, fnumber, string);   
 rewind(fp);   
 fscanf(fp,"%d %f %s", &inumber, &fnumber, string);   
 printf("%d %f %s/n", inumber, fnumber, string);   
 fclose(fp);   
 return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值