1. 程式人生 > > VC:va_list用法---隱含引數的使用方法

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;   
}