C语言中getopt()函数和select()函数的使用方法

C语言getopt()函数:分析命令行参数
头文件

#include <unistd.h>

定义函数:

int getopt(int argc, char * const argv[], const char * optstring);

函数说明:getopt()用来分析命令行参数。
1、参数argc 和argv 是由main()传递的参数个数和内容。
2、参数optstring 则代表欲处理的选项字符串。

此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。

如果选项字符串里的字母后接着冒号":",则表示还有相关的参数,全域变量optarg 即会指向此额外参数。
如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt 设为"?"字符, 如果不希望getopt()印出错信息,则只要将全域变量opterr 设为0 即可。

返回值:如果找到符合的参数则返回此参数字母, 如果参数不包含在参数optstring 的选项字母则返回"?"字符,分析结束则返回-1.

范例

#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
  int ch;
  opterr = 0;
  while((ch = getopt(argc, argv, "a:bcde")) != -1)
  switch(ch)
  {
   case 'a':
     printf("option a:'%s'\n", optarg); break;
   case 'b':
     printf("option b :b\n"); break;
   default:
     printf("other option :%c\n", ch);
  }
  printf("optopt +%c\n", optopt);
}

执行:

$. /getopt -b
option b:b
$. /getopt -c
other option:c
$. /getopt -a
other option :?
$. /getopt -a12345
option a:'12345'

C语言select()函数:I/O多工机制
定义函数:

int select(int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout);

函数说明:select()用来等待文件描述词状态的改变. 参数n 代表最大的文件描述词加1, 参数readfds、writefds 和exceptfds 称为描述词组, 是用来回传该描述词的读, 写或例外的状况. 底下的宏提供了处理这三种描述词组的方式:

  • FD_CLR(inr fd, fd_set* set); 用来清除描述词组set 中相关fd 的位
  • FD_ISSET(int fd, fd_set *set); 用来测试描述词组set 中相关fd 的位是否为真
  • FD_SET(int fd, fd_set*set); 用来设置描述词组set 中相关fd 的位
  • FD_ZERO(fd_set *set); 用来清除描述词组set 的全部位

参数 timeout 为结构timeval, 用来设置select()的等待时间, 其结构定义如下:

struct timeval
{
  time_t tv_sec;
  time_t tv_usec;
};

返回值:如果参数timeout 设为NULL 则表示select ()没有timeout.

错误代码:执行成功则返回文件描述词状态已改变的个数, 如果返回0 代表在描述词状态改变前已超过timeout 时间, 当有错误发生时则返回-1, 错误原因存于errno, 此时参数readfds, writefds, exceptfds 和timeout的值变成不可预测。

  • EBADF 文件描述词为无效的或该文件已关闭
  • EINTR 此调用被信号所中断
  • EINVAL 参数n 为负值.
  • ENOMEM 核心内存不足

范例:
常见的程序片段:

fs_set readset;
FD_ZERO(&readset);
FD_SET(fd, &readset);
select(fd+1, &readset, NULL, NULL, NULL);
if(FD_ISSET(fd, readset){...}
(0)

相关推荐

  • C语言中经socket接收数据的相关函数详解

    recv()函数: 头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int recv(int s, void *buf, int len, unsigned int flags); 函数说明:recv()用来接收远端主机经指定的socket 传来的数据, 并把数据存到由参数buf 指向的内存空间, 参数len 为可接收数据的最大长度. 参数 flags 一般设0. 其他数值定义如下: 1.MSG_OOB 接收以ou

  • C语言中send()函数和sendto()函数的使用方法

    C语言send()函数:经socket传送数据 头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int send(int s, const void * msg, int len, unsigned int falgs); 函数说明:send()用来将数据由指定的socket 传给对方主机. 参数s 为已建立好连接的socket. 参数msg 指向欲连线的数据内容, 参数len 则为数据长度. 参数flags 一般

  • C语言fillpoly函数详解

    C语言中,fillpoly函数的功能是画一个多边形,今天我们就来学习学习. C语言fillpoly函数:填充一个多边形 函数名:fillpoly 功  能:画并填充一个多边形 头文件:#include <graphics.h> 原  型:fillpoly(int numpoints, int far *polypoints); 参数说明:numpoints 为多边形的边数:far *polypoints 为存储各顶点坐标的数组,每两个一组表示一个顶点的 X 和 Y 坐标. 实例代码: #inc

  • C语言中socket相关网络编程函数小结

    C语言socket()函数:建立一个socket通信 头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int socket(int domain, int type, int protocol); 函数说明:socket()用来建立一个新的socket, 也就是向系统注册, 通知系统建立一通信端口. 参数domain 指定使用何种的地址类型, 完整的定义在/usr/include/bits/socket.h 内,

  • 详解C语言中accept()函数和shutdown()函数的使用

    C语言accept()函数:接受socket连线 头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int accept(int s, struct sockaddr * addr, int * addrlen); 函数说明:accept()用来接受参数s 的socket 连线. 参数s 的socket 必需先经bind().listen()函数处理过, 当有连线进来时accept()会返回一个新的socket 处理

  • C语言设置和取得socket状态的相关函数用法

    C语言setsockopt()函数:设置socket状态 头文件: #include <sys/types.h> #include <sys/socket.h> 定义函数: int setsockopt(int s, int level, int optname, const void * optval, ,socklen_toptlen); 函数说明:setsockopt()用来设置参数s 所指定的socket 状态. 参数level 代表欲设置的网络层, 一般设成SOL_SOC

  • 详解C语言中的ttyname()函数和isatty()函数的用法

    C语言ttyname()函数:返回一终端机名称 头文件: #include <unistd.h> 定义函数: char * ttyname(int desc); 函数说明:如果参数desc 所代表的文件描述词为一终端机, 则会将此终端机名称由一字符串指针返回, 否则返回NULL. 返回值:如果成功则返回指向终端机名称的字符串指针, 有错误情况发生时则返回NULL. 范例 #include <unistd.h> #include <sys/types.h> #includ

  • C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数:改变或增加环境变量 头文件: #include4<stdlib.h> 定义函数: int putenv(const char * string); 函数说明:putenv()用来改变或增加环境变量的内容. 参数string 的格式为name=value, 如果该环境变量原先存在, 则变量内容会依参数string 改变, 否则此参数内容会成为新的环境变量. 返回值:执行成功则返回0, 有错误发生则返回-1. 错误代码:ENOMEM 内存不足, 无法配置新的环境变量空间

  • C语言的isatty函数和ttyname函数以及sendmsg函数用法

    isatty()函数 头文件: #include <unistd.h> 定义函数: int isatty(int desc); 函数说明:如果参数 desc 所代表的文件描述词为一终端机则返回1, 否则返回0. 返回值:如果文件为终端机则返回1, 否则返回0. C语言ttyname()函数:返回一终端机名称 头文件: #include <unistd.h> 定义函数: char * ttyname(int desc); 函数说明:如果参数desc 所代表的文件描述词为一终端机, 则

  • C语言中strlen() strcpy() strcat() strcmp()函数的实现方法

    strlen函数原型:unsigned int strlen(const char *);返回的是字符串中第一个\0之前的字符个数. 1.strcat函数原型char* strcat(char* dest,const char* src); 进行字符串的拼接,将第二个字符串连接到第一个字符串中第一个出现\0开始的地方.返回的是拼接后字符的首地址.并不检查第一个数组的大小是否可以容纳第二个字符串.如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元. 2.str

  • 浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, const char *strSrc) { char *res=strDest; assert((strDest!=NULL)&&(strSrc!=NULL)); while(*strDest)strDest++; while(*strDest=*strSrc) { strDest++; strSrc

  • R语言中的fivenum与quantile()函数算法详解

    fivenum()函数: 返回五个数据:最小值.下四分位数数.中位数.上四分位数.最大值 对于奇数个数字=5,fivenum()先排序,依次返回最小值.下四分位数.中位数.上四分位数.最大值 > fivenum(c(1,12,40,23,13)) [1] 1 12 13 23 40 对于奇数个数字>5,fivenum()先排序,我们可以求取最小值,最大值,中位数.在排序中,最小值与中位数中间,若为奇数,取其中位数为下四分位数,若为偶数,取最中间两个数的平均值为下四分位数:在排序中,中位数与最大

  • 详解C语言中sizeof如何在自定义函数中正常工作

    1.在main函数中,sizeof是可以正常工作的,比如: int main() { int n[5]; printf("input: \n"); int i ; for(i = 0; i < 5; i++) { scanf("%d",n + i); } int len = sizeof(n)/sizeof(n[0]); printf("%d\n",len); return 0; } 2.但是在自定义函数中就不可以了,如下: #includ

  • C语言中getopt()函数和select()函数的使用方法

    C语言getopt()函数:分析命令行参数 头文件 #include <unistd.h> 定义函数: int getopt(int argc, char * const argv[], const char * optstring); 函数说明:getopt()用来分析命令行参数. 1.参数argc 和argv 是由main()传递的参数个数和内容. 2.参数optstring 则代表欲处理的选项字符串. 此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字

  • 举例详解Go语言中os库的常用函数用法

    (f *File).Name()这个函数是返回文件的名称,函数原型func (f *File) Name() string要文件的指针操作,返回字符串,感觉比较鸡助的方法底层实现 复制代码 代码如下: func (f *File) Name() string { return f.name }  import (  "fmt"  "os" ) func main() {  f, _ := os.Open("1.go")  fmt.Println(

  • 浅析C语言中的setjmp与longjmp函数

    setjmp和longjmp是C语言独有的,只有将它们结合起来使用,才能达到程序控制流有效转移的目的,按照程序员的预先设计的意图,去实现对程序中可能出现的异常进行集中处理. 先来看一下这两个函数的定义吧: setjmp和longjmp的函数原型在setjmp.h中 函数原型:int setjmp(jmp_buf envbuf); setjmp函数用缓冲区envbuf保存系统堆栈的内容,以便后续的longjmp函数使用.setjmp函数初次启用时返回0值. void longjmp(jmp_buf

  • go语言中的interface使用实例

    go语言中的interface是一组未实现的方法的集合,如果某个对象实现了接口中的所有方法,那么此对象就实现了此接口.与其它面向对象语言不同的是,go中无需显示声明调用了哪个接口. 复制代码 代码如下: package main   import (  "fmt" )   type I interface {  Get() int  Put(int) }   type S struct{ i int }   func (p *S) Get() int  { return p.i } f

  • MySQL数据库之内置函数和自定义函数 function

    目录 1.内置函数 1.1.字符串函数 1.2.时间函数 1.3.数学函数 1.4.其他函数 2.自定义函数 2.1.创建函数 2.2.查看函数 2.3.调用函数 2.4.删除函数 2.5.注意事项 3.函数流程结构案例 前言: 函数分为两类:系统函数和自定义函数 使用函数: select 函数名(参数列表); 1.内置函数 1.1.字符串函数 函数名 说明 char_length 判断字符串的字符数 length 判断字符串的字节数,与字符集有关 concat 连接字符串 insrt 检查字符

随机推荐