导航:首页 > 操作系统 > linuxopencreat

linuxopencreat

发布时间:2024-07-01 05:39:19

1. linux信号量

信号量是包含一个非负整数型的变量,并且带有两个原子操作wait和signal。Wait还可以被称为down、P或lock,signal还可以被称为up、V、unlock或post。在UNIX的API中(POSIX标准)用的是wait和post。

对于wait操作,如果信号量的非负整形变量S大于0,wait就将其减1,如果S等于0,wait就将调用线程阻塞;对于post操作,如果有线程在信号量上阻塞(此时S等于0),post就会解除对某个等待线程的阻塞,使其从wait中返回,如果没有线程阻塞在信号量上,post就将S加1.

由此可见,S可以被理解为一种资源的数量,信号量即是通过控制这种资源的分配来实现互斥和同步的。如果把S设为1,那么信号量即可使多线程并发运行。另外,信号量不仅允许使用者申请和释放资源,而且还允许使用者创造资源,这就赋予了信号量实现同步的功能。可见信号量的功能要比互斥量丰富许多。

POSIX信号量是一个sem_t类型的变量,但POSIX有两种信号量的实现机制: 无名信号量 命名信号量 。无名信号量只可以在共享内存的情况下,比如实现进程中各个线程之间的互斥和同步,因此无名信号量也被称作基于内存的信号量;命名信号量通常用于不共享内存的情况下,比如进程间通信。

同时,在创建信号量时,根据信号量取值的不同,POSIX信号量还可以分为:

下面是POSIX信号量函数接口:

信号量的函数都以sem_开头,线程中使用的基本信号函数有4个,他们都声明在头文件semaphore.h中,该头文件定义了用于信号量操作的sem_t类型:

【sem_init函数】:

该函数用于创建信号量,原型如下:

该函数初始化由sem指向的信号对象,设置它的共享选项,并给它一个初始的整数值。pshared控制信号量的类型,如果其值为0,就表示信号量是当前进程的局部信号量,否则信号量就可以在多个进程间共享,value为sem的初始值。

该函数调用成功返回0,失败返回-1。

【sem_destroy函数】:

该函数用于对用完的信号量进行清理,其原型如下:

成功返回0,失败返回-1。

【sem_wait函数】:

该函数用于以原子操作的方式将信号量的值减1。原子操作就是,如果两个线程企图同时给一个信号量加1或减1,它们之间不会互相干扰。其原型如下:

sem指向的对象是sem_init调用初始化的信号量。调用成功返回0,失败返回-1。

sem_trywait()则是sem_wait()的非阻塞版本,当条件不满足时(信号量为0时),该函数直接返回EAGAIN错误而不会阻塞等待。

sem_timedwait()功能与sem_wait()类似,只是在指定的abs_timeout时间内等待,超过时间则直接返回ETIMEDOUT错误。

【sem_post函数】:

该函数用于以原子操作的方式将信号量的值加1,其原型如下:

与sem_wait一样,sem指向的对象是由sem_init调用初始化的信号量。调用成功时返回0,失败返回-1。

【sem_getvalue函数】:

该函数返回当前信号量的值,通过restrict输出参数返回。如果当前信号量已经上锁(即同步对象不可用),那么返回值为0,或为负数,其绝对值就是等待该信号量解锁的线程数。

【实例1】:

【实例2】:

之所以称为命名信号量,是因为它有一个名字、一个用户ID、一个组ID和权限。这些是提供给不共享内存的那些进程使用命名信号量的接口。命名信号量的名字是一个遵守路径名构造规则的字符串。

【sem_open函数】:

该函数用于创建或打开一个命名信号量,其原型如下:

参数name是一个标识信号量的字符串。参数oflag用来确定是创建信号量还是连接已有的信号量。

oflag的参数可以为0,O_CREAT或O_EXCL:如果为0,表示打开一个已存在的信号量;如果为O_CREAT,表示如果信号量不存在就创建一个信号量,如果存在则打开被返回,此时mode和value都需要指定;如果为O_CREAT|O_EXCL,表示如果信号量存在则返回错误。

mode参数用于创建信号量时指定信号量的权限位,和open函数一样,包括:S_IRUSR、S_IWUSR、S_IRGRP、S_IWGRP、S_IROTH、S_IWOTH。

value表示创建信号量时,信号量的初始值。

【sem_close函数】:

该函数用于关闭命名信号量:

单个程序可以用sem_close函数关闭命名信号量,但是这样做并不能将信号量从系统中删除,因为命名信号量在单个程序执行之外是具有持久性的。当进程调用_exit、exit、exec或从main返回时,进程打开的命名信号量同样会被关闭。

【sem_unlink函数】:

sem_unlink函数用于在所有进程关闭了命名信号量之后,将信号量从系统中删除:

【信号量操作函数】:

与无名信号量一样,操作信号量的函数如下:

命名信号量是随内核持续的。当命名信号量创建后,即使当前没有进程打开某个信号量,它的值依然保持,直到内核重新自举或调用sem_unlink()删除该信号量。

无名信号量的持续性要根据信号量在内存中的位置确定:

很多时候信号量、互斥量和条件变量都可以在某种应用中使用,那这三者的差异有哪些呢?下面列出了这三者之间的差异:

2. Linux C函数实例速查手册的目录

第1章 初级I/O函数
1.1 close函数:关闭已经打开的文件
1.2 creat函数:创建一个文件
1.3 p函数:复制文件描述符
1.4 p2函数:复制文件描述符到指定的位置
1.5 fcntl函数:改变文件的状态
1.6 fsync函数:将缓冲区数据回写到磁盘文件
1.7 Lseek函数:移动文件的读写位置
1.8 open函数:打开一个文件
1.9 read函数:读取文件的数据
1.10 sync函数:将所有打开的文件写回磁盘
1.11 write函数:输出内容到文件
第2章 文件管理操作函数
2.1 access函数:判断进程是否具有访问文件的权限
2.2 alphasort函数:按照字母顺序排序目录结构
2.3 chdir函数:改变当前的工作目录
2.4 chmod函数:改变文件的权限
2.5 chown函数:改变文件的所有者
2.6 chroot函数:改变进程的根目录
2.7 closedir函数:关闭目录文件
2.8 fchdir函数:使用文件描述符改变当前的工作目录
2.9 fchmod函数:改变一个已经打开的文件的权限
2.10 fstat函数:得到一个打开文件的状态
2.11 truncate函数:改变一个打开文件的大小
2.12 ftw函数:遍历目录树
2.13 get_current_dir_name函数:取得当前的工作目录
2.14 getcwd函数:取得进程的当前工作目录
2.15 lchown函数:改变符号链接文件的拥有者
2.16 link函数:建立一个硬链接
2.17 lstat函数:得到符号链接的文件状态
2.18 nftw函数:遍历目录树
2.19 opendir函数:打开目录文件
2.20 readdir函数:读取目录文件的内容
2.21 readlink函数:读取符号链接文件本身的内容
2.22 realpath函数:将相对目录路径转换成绝对路径
2.23 remove函数:删除文件或者目录
2.24 rename函数:更改文件的名称或位置
2.25 rewinddir函数:回卷目录文件
2.26 seekdir函数:文件定位函数
2.27 stat函数:取得文件状态
2.28 symlink函数:创建一个符号链接
2.29 telldir函数:取得目录文件的读取位置
2.30 truncate函数:改变文件大小
2.31 umask:设置创建文件时使用的权限掩码
2.32 unlink函数:删除文件的一个硬链接
第3章 标准I/O函数
3.1 clearerr函数:清除错误标志
3.2 fclose函数:关闭流文件描述符
3.3 fdopen函数:转换文件描述符到文件指针
3.4 feof函数:文件结束判断函数
3.5 fflush函数:刷新流文件读写缓存
3.6 fgetc函数:从流文件中读取一个字符
3.7 fgetpos函数:返回流文件当前读写位置
3.8 fgets函数:从流文件中读出一行数据
3.9 fileno函数:获得流文件的文件描述符
3.10 fopen函数:打开文件
3.11 fputc函数:将字符写入流文件
3.12 fputs函数:将字符串写入流文件
3.13 fread函数:从流文件中读出数据
3.14 freopen函数:打开文件
3.15 fseek函数:移动流文件的读写位置
3.16 fsetpos函数:设置流文件当前读写位置
3.17 ftell函数:得到流文件的读取位置
3.18 fwrite函数:向流文件中写入数据
3.19 getc函数:从文件中读出一个字符
3.20 getchar函数:从标准输入中读入一个字符
3.21 gets函数:从标准输入中读入一行数据
3.22 mktemp函数:产生临时文件的文件名
3.23 putc函数:将字符写入文件
3.24 putchar函数:将字符输出到标准输出中
3.25 puts函数:将字符串输出在标准输出中
3.26 rewind函数:将流文件的读写位置移动到文件的起始位置
3.27 setbuf函数:设置文件缓冲区
3.28 setbuffer函数:设置文件缓冲区
3.29 setlinebuf函数:设置行缓冲模式
3.30 setvbuf函数:设置自定义文件缓冲区
3.31 tmpfile函数:建立临时的二进制文件
3.32 ungetc函数:将字符写回文件
第4章 格式化输入输出函数
4.1 fprintf函数:格式化输出到文件
4.2 fscanf函数:格式化从文件中读出数据
4.3 printf函数:格式化输出
4.4 scanf函数:格式化输入
4.5 snprintf函数:格式化字符输入
4.6 sprintf函数:格式化字符串打印
4.7 sscanf函数:格式化字符串取值
4.8 vfprintf函数:可变参数输出函数
4.9 vfscanf函数:格式化输入
4.10 vprintf函数:格式化输出函数
4.11 vscanf函数:格式化输入函数
4.12 vsnprintf函数:格式化字符串复制
4.13 vsprintf函数:格式化字符串复制
4.14 vsscanf函数:格式化字符输入
第5章 进程控制
5.1 abort函数:进程异常终止函数
5.2 atexit函数:进程终止处理函数
5.3 execl函数:执行文件函数
5.4 execle函数:执行文件的函数
5.5 execlp函数:从PATH环境变量中查找文件并执行
5.6 execv函数:执行文件
5.7 execve函数:执行文件
5.8 execvp函数:执行文件
5.9 exit函数:结束进程运行的函数
5.10 _exit函数:结束进程运行的函数
5.11 fork函数:建立一个新的进程
5.12 getgid函数:取得实际进程组ID
5.13 getegid函数:取得有效进程组ID
5.14 getpid函数:取得有效组ID
5.15 getppid函数:取得父进程的进程识别码
5.16 getpriority函数:取得进程执行优先级
5.17 longjmp函数:跳到原先setjmp存储的堆栈环境
5.18 on_exit函数:设置程序正常结束前调用的函数
5.19 setjmp函数:存储当前堆栈环境
5.20 setgid函数:设置进程的进程组ID
5.21 setuid函数:设置进程组ID
5.22 setpriority函数:设置程序进程优先级
5.23 siglongjmp函数:跳到原先sigset jmp存储的堆栈环境
5.24 sigsetjmp函数:存储当前堆栈环境和屏蔽的信号集
5.25 system函数:执行Shell命令
5.26 vfork函数:建立一个新的进程
5.27 wait函数:等待子进程中断或结束
5.28 waitpid函数:等待子进程中断或结束
5.29 wait3函数:等待进程结束并且输出子进程统计信息
第6章 进程间通信函数
6.1 ftok函数:获得项目相关的IPC键值
6.2 msgctl函数:消息队列操作函数
6.3 msgget函数:创建或打开消息队列
6.4 msgrcv函数:读取消息队列
6.5 msgsnd函数:向消息队列中写入消息
6.6 semctl函数:信号量操作函数
6.7 semget函数:创建或打开信号量
6.8 semop函数:释放或获取信号量
6.9 shmat函数:导入共享内存
6.10 shmctl函数:共享内存操作函数
6.11 shmdt函数:将共享内存从程序中脱离
6.12 shmget函数:创建共享内存
6.13 mkfifo函数:创建fifo管道函数
6.14 pclose函数:关闭管道文件
6.15 pipe函数:创建匿名管道
6.16 popen函数:创建管道文件
第7章 信号函数
7.1 alarm函数:内核定时器函数
7.2 kill函数:信号发送函数
7.3 pause函数:进程暂停执行函数
7.4 raise函数:向进程自身发送信号函数
7.5 sigaction函数:高级信号处理方式设置函数
7.6 sigaddset函数:添加信号到信号集函数
7.7 sigdelset函数:删除信号集中对应信号函数
7.8 sigemptyset函数:清空信号集函数
7.9 sigfillset函数:填充信号集函数
7.10 sigismember函数:测试某个信号是否在信号集中
7.11 signal函数:信号处理方式设置函数
7.12 sigpause函数:暂停进程直到信号到来
7.13 sigpending函数:查询未决信号
7.14 sigprocmask函数:信号屏蔽函数
7.15 sigsuspend函数:暂停直到信号到来
7.16 sleep函数:让进程休眠一段时间
第8章 用户、组函数及环境变量函数
8.1 clearenv函数:删除所有环境变量的值
8.2 cuserid函数:获得用户名函数
8.3 endgrent函数:关闭系统组文件函数
8.4 endpwent函数:关闭系统口令函数
8.5 entent函数:关闭utmp文件
8.6 fgetgrent函数:从文件中读取组数据
8.7 fgetpwent函数:从文件中读取密码格式数据
8.8 getegid函数:获得有效(effective gid)组识别符
8.9 getenv函数:取得环境变量的值
8.10 geteuid函数:获得有效(effective uid)用户识别符
8.11 getgid函数:获得组识别符
8.12 getgrent函数:从文件/etc/group中读取组信息
8.13 getgrgid函数:从文件/etc/group中查找组信息
8.14 getgrnam函数:从文件/etc/group中查找组信息
8.15 getgroups函数:返回当前用户所属的组列表
8.16 getlogin函数:获取当前用户的账号名称
8.17 getpw函数:获取指定uid的用户信息
8.18 getpwent函数:读取/etc/passwd文件中的数据
8.19 getpwnam函数:以用户名获取用户信息
8.20 getpwuid函数:以用户ID获取用户信息
8.21 getuid函数:获取当前进程所属的用户ID
8.22 getutent函数:获取登录信息
8.23 getutid函数:获取指定用户ID的登录信息
8.24 getutline函数:查找指定的登录信息
8.25 initgroups函数:初始化组信息
8.26 logwtmp函数:添加登录记录信息
8.27 putenv函数:改变环境变量的值
8.28 pututline函数:添加登录信息
8.29 setegid函数:设置有效组ID
8.30 setenv函数:改变环境变量的值
8.31 seteuid函数:设置有效用户ID
8.32 setfsgid函数:设置进程的文件系统的组ID
8.33 setfsuid函数:设置进程的文件系统的用户ID
8.34 setgid函数:设置进程的组ID
8.35 setgrent函数:将文件etc/group的读写位置移动到起始位置
8.36 setgroups函数:设置当前进程的组识别符
8.37 setpwent函数:将文件etc/passwd的读写位置移动到起始位置
8.38 setregid函数:设置当前进程的真实以及有效组ID
8.39 setreuid函数:设置当前进程的真实以及有效用户ID
8.40 setuid函数:设置进程的用户ID
8.41 setutent函数:将文件utmp的读写位置移动到起始位置
8.42 unsetenv函数:清除环境变量的值
8.43 updwtmp函数:将登录数据记录写入utmp文件
8.44 utmpname函数:设置文件utmp的绝对位置
第9章 错误处理与内存分配函数
9.1 brk函数:改变数据段大小
9.2 calloc函数:内存分配函数
9.3 ferror函数:文件错误判断
9.4 free函数:释放动态分配内存函数
9.5 getpagesize函数:获得操作系统内存页大小函数
9.6 malloc函数:动态内存分配函数
9.7 mmap函数:文件映射函数
9.8 munmap函数:释放映射的内存地址
9.9 perror函数:错误原因输出函数
9.10 realloc函数:内存截取函数
9.11 sbrk函数:增加数据空间
9.12 strerror函数:错误代码查询
第10章 日志函数、动态函数与正则表达式函数
10.1 closelog函数:关闭信息记录
10.2 dlclose函数:关闭动态库文件
10.3 dlerror函数:动态函数出错处理
10.4 dlopen函数:打开动态库文件
10.5 dlsym函数:在动态库文件中查找函数
10.6 openlog函数:打开记录信息
10.7 regcomp函数:编译正则表达式
10.8 regerror函数:编译错误判断函数
10.9 regexec函数:执行正则匹配
10.10 regfree函数:释放正则模式串资源
10.11 syslog函数:输出记录信息
第11章 时间函数
11.1 asctime函数:字符串时间操作函数
11.2 clock函数:计算运行时间函数
11.3 ctime函数:字符串时间函数
11.4 difftime函数:计算时间差函数
11.5 ftime函数:取得系统时间
11.6 gettimeofday函数:取得系统当前时间
11.7 gmtime函数:日历时间格式函数
11.8 localtime函数:获得当前系统时间
11.9 mktime函数:系统时间转换函数
11.10 settimeofday函数:系统时间设置函数
11.11 strftime函数:时间格式化输出函数
11.12 time函数:获得系统当前时间
11.13 tzset函数:设置系统时区变量tzname
第12章 socket相关函数
12.1 accept函数:处理socket请求函数
12.2 bind函数:将socket描述符与一个套接口绑定
12.3 connect函数:与远程主机连接
12.4 endprotoent函数:结束网络协议的读取函数
12.5 endservent函数:关闭文件/etc/services
12.6 gethostbyaddr函数:由IP获得主机信息
12.7 gethostbyname函数:由主机名获得主机信息
12.8 getprotobyname函数:由协议名获取协议数据
12.9 getprotobynumber函数:由协议编号获取协议数据
12.10 getprotoent函数:读取文件/etc/rotoent中的网络协议数据
12.11 getservbyname函数:获得网络服务协议数据
12.12 getservbyport函数:获得网络服务协议数据
12.13 getservent函数:读取主机网络服务数据
12.14 getsockopt函数:获得指定socket描述符的状态
12.15 herror函数:错误原因输出函数
12.16 hstrerror函数:错误代码查询
12.17 htonl函数:地址字节顺序转换
12.18 htons函数:地址字节顺序转换
12.19 inet_addr函数:网络地址类型转换
12.20 inet_aton函数:网络地址类型转换
12.21 inet_ntoa函数:网络地址类型转换
12.22 listen函数:网络socket监听
12.23 ntohl函数:地址字节顺序转换
12.24 ntohs函数:地址字节顺序转换
12.25 recv函数:接收消息
12.26 recvfrom函数:接收消息
12.27 recvmsg函数:多缓冲读取数据
12.28 send函数:向远程主机发送数据
12.29 sendto函数:发送数据到远程主机
12.30 setprotoent函数:打开网络协议文件
12.31 setservent函数:打开网络服务文件
12.32 setsockopt函数:设置socket描述符的状态
12.33 shutdown函数:结束socket套接字
12.34 socket函数:创建网络套接字
第13章 字符测试函数
13.1 isalnum函数:判断字符是否为英文字母或数字
13.2 isalpha函数:判断字符是否为英文字母
13.3 isascii函数:判断字符是否为ASCII字符
13.4 isblank函数:判断字符是否为空白字符
13.5 iscntrl函数:判断字符是否为ASCII的控制字符
13.6 isdigit函数:判断字符是否为阿拉伯数字
13.7 isgraph函数:判断字符是否为可打印字符
13.8 islower函数:判断字符是否为小写英文字母
13.9 isprint函数:判断字符是否为可打印字符
13.10 isspace函数:判断字符是否为空格字符
13.11 ispunct函数:判断字符是否为标点符号
13.12 isupper函数:判断字符是否为大写英文字母
13.13 isxdigit函数:判断字符是否为十六进制数字
第14章 数据转换函数
14.1 atof函数:将字符串转换成浮点数
14.2 atoi函数:将字符串转换成整数
14.3 atol函数:将字符串转换成长整数
14.4 ecvt函数:将浮点数转换成字符串
14.5 fcvt函数:将浮点数转换成字符串
14.6 gcvt函数:将浮点数转换成字符串
14.7 strtod函数:将字符串转换成浮点数
14.8 strtol函数:将字符串转换成长整数
14.9 strtoul函数:将字符串转换成无符号长整数
14.10 toascii函数:将整数转换成合法的ASCII字符
14.11 tolower函数:将大写字母转换成小写字母
14.12 toupper函数:将小写字母转换成大写字母
第15章 字符串处理函数
15.1 bcmp函数:比较两块内存中的内容
15.2 b函数:复制内存中的内容
15.3 bzero函数:将一块内存内容全清零
15.4 ffs函数:在一个整数中查找第一个值为真的位
15.5 index函数:查找字符串中第一个出现的指定字符
15.6 memccpy函数:复制内存中的内容
15.7 memchr函数:在一块内存指定范围查找一个指定字符
15.8 memcmp函数:比较内存中存放的内容
15.9 memcpy函数:复制一块内存内容到另一块中
15.10 memfrob函数:对某个内存区重新编码
15.11 memmove函数:复制内存内容
15.12 memset函数:将某值填入到一块内存区域
15.13 rindex函数:查找字符串中最后一个出现的指定字符
15.14 strcasecmp函数:忽略大小写比较字符串
15.15 strcat函数:将一个字符串连接另一字符串的尾部
15.16 strchr函数:查找字符串中指定字符
15.17 strcmp函数:比较两个字符串
15.18 strcoll的函数:根据当前环境信息来比较字符串
15.19 strcpy函数:复制一个字符串的内容到另一个字符串中
15.20 strcspn函数:计算字符串中由非指定字符集字符组成的子字符串的长度
15.21 strp函数:复制字符串内容
15.22 strfry函数:随机重组一个字符串
15.23 strlen函数:返回字符串长度
15.24 strncasecmp函数:忽略大小写比较两个字符串
15.25 strncat函数:将一个字符串的前n个字符连接到另一字符串的尾部
15.26 strncmp函数:比较两个字符串
15.27 strncpy函数:复制字符串
15.28 strpbrk函数:查找字符串中第一个出现的指定字符
15.29 strrchr函数:查找字符串中最后一个出现的指定字符
15.30 strspn函数:计算字符串中由指定字符集字符组成的子字符串的长度
第16章 数学计算函数
16.1 abs函数:计算整数的绝对值
16.2 acos函数:计算反余弦的值
16.3 asin函数:计算反正弦的值
16.4 atan函数:计算反正切的值
16.5 atan2函数:计算反正切的值
16.6 ceil函数:计算大于或等于给定参数的最小整数
16.7 cos函数:计算余弦的值
16.8 cosh函数:计算双曲线的余弦值
16.9 div函数:计算两整数相除后的商和余数
16.10 exp函数:计算浮点数的指数
16.11 fabs函数:计算浮点数的绝对值
16.12 frexp函数:计算浮点数的尾数和指数
16.13 hypot函数:计算直角三角形斜边长度
16.14 labs函数:计算长整数的绝对值
16.15 ldexp函数:计算浮点数与2的exp次方的积
16.16 ldiv函数:计算两长整数相除后的商和余数
16.17 log函数:计算以e为底的对数值
16.18 log10函数:计算以10为底的对数值
16.19 modf函数:将浮点数分解为小数和整数两部分
16.20 pow函数:计算次方值
16.21 sin函数:取正弦的值
16.22 sinh函数:计算双曲线的正弦值
16.23 sqrt函数:计算浮点数的平方根
16.24 tan函数:计算角度的正切值
16.25 tanh函数:计算双曲线的正切函数值
第17章 随机数及数据加密函数
17.1 crypt函数:对字符串使用DES算法编码
17.2 drand48函数:产生一个正的随机浮点数
17.3 erand48函数:产生一个正的随机浮点数
17.4 initstate:建立随机数状态数组
17.5 jrand48函数:产生一个长整型的随机数
17.6 lcong48函数:设置48位运算的随机数种子
17.7 lrand48函数:产生一个正的长整型随机数
17.8 mrand48函数:产生一个长整型随机数
17.9 nrand48函数:产生一个正的长整数随机数
17.10 rand函数:产生伪随机数
17.11 random函数:产生随机数
17.12 seed48函数:设置48位运算的随机数种子
17.13 setstate函数:建立随机数状态数组
17.14 srand函数:设置随机数种子
17.15 srand48函数:设置48位运算的随机数种子
17.16 srandom函数:设置随机数种子
17.17 getpass函数:取得用户输入密码字符串
第18章 数据结构函数
18.1 bsearch函数:在有序数组中二分查找数据
18.2 hcreate函数:建立哈希表
18.3 hdestroy函数:删除哈希表
18.4 hsearch函数:在哈希表中查找关键数据
18.5 lfind函数:线性搜索
18.6 lsearch函数:线性搜索
18.7 qsort函数:使用快速排序法排列数组
18.8 tdelete函数:从二叉树中删除数据
18.9 tfind函数:搜索二叉树
18.10 tsearch函数:搜索二叉树
18.11 twalk函数:遍历二叉树
第19章 其他函数
19.1 getopt函数:分析命令参数
19.2 isatty函数:判断文件描述符是否为终端
19.3 pselect函数:多路转接I/O
19.4 select函数:多路I/O转接
19.5 ttyname函数:返回终端机的名称
附录A Linux函数的首字母索引
附录B Linux指令的首字母索引

3. linux open函数创建文件的默认权限问题

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

int main() {
int fd = -1;
fd = open("_561804018.dat", O_CREAT | O_TRUNC | O_RDWR, 0666);
if (fd < 0) {
perror("open");
return -1;
}
char buff[64];
strcpy(buff, "Hello!I am writing to this file!");
int count = strlen(buff);
if (write(fd, buff, count) < 0) {
perror("write");
return -1;
}
if (lseek(fd, 0, SEEK_SET) < 0) {
perror("lseek");
return -1;
}
if (read(fd, buff, 10) < 0) {
perror("read");
return -1;
}
buff[10] = 0x00;
printf("%s\n", buff);
if (fd > 0) {
close(fd);
fd = -1;
}
return 0;
}

4. linux c 的 open(文件路径,O_WRONLY | O_CREAT) 里面的与运算为什么可以实现打不开就创建

open 函数可以打开或创建一个文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
返回值:成功返回新分配的文件描述符,出错返回-1并设置errno
在Man Page中open 函数有两种形式,一种带两个参数,一种带三个参数,其实在C代码
中open 函数是这样声明的:
int open(const char *pathname, int flags, ...);
最后的可变参数可以是0个或1个,由flags 参数中的标志位决定,见下面的详细说明。
pathname 参数是要打开或创建的文件名,和fopen 一样,pathname 既可以是相对路径也可以是绝
对路径。flags 参数有一系列常数值可供选择,可以同时选择多个常数用按位或运算符连接起
来,所以这些常数的宏定义都以O_开头,表示or。
必选项:以下三个常数中必须指定一个,且仅允许指定一个。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
以下可选项可以同时指定0个或多个,和必选项按位或起来作为flags 参数。可选项有很多,这
里只介绍一部分,其它选项可参考open(2)的Man Page:
O_APPEND 表示追加。如果文件已有内容,这次打开文件所写的数据附加到文件的末尾而不
覆盖原来的内容。
O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode ,表示该文件
的访问权限。
O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回。
O_TRUNC 如果文件已存在,并且以只写或可读可写方式打开,则将其长度截断
(Truncate)为0字节。
O_NONBLOCK 对于设备文件,以O_NONBLOCK 方式打开可以做非阻塞I/O(Nonblock I/O).

5. linux阒诲炰笌闱为樆濉濒inux阒诲为潪阒诲

鍦ㄩ潪阒诲炴ā寮忎笂镐庝箞鐭ラ亾recv鎺ユ敹鏁版嵁瀹屾垚锛

浠linux涓媡cpsocket缂栫▼涓轰緥锛氶樆濉炲氨鏄痳ecv/read镄勬椂鍊檚ocket鎺ユ敹缂揿啿鍖鸿佹槸链夋暟鎹灏辫伙纴娌℃暟鎹鎴戝氨涓鐩寸浔瑙夎禆镌涓嶈蛋锛岀洿鍒版湁鏁版嵁𨱒ヤ简璇诲畬鎴戞墠璧般

send/write镄勬椂鍊欙纴瑕佹槸鍙戦佺紦鍐插尯婊′简锛屾病链夌┖闂寸户缁鍙戦佷简鎴戜篃涓鐩寸浔瑙夎禆镌涓嶈蛋锛岀洿鍒板彂阃佺紦鍐插尯鑵惧嚭瓒冲熺殑绌洪棿璁╂垜鎶婃暟鎹鍏ㄩ儴濉炲埌鍙戦佺紦鍐插尯閲屾垜镓嶈蛋銆

锛埚綋铹跺傛灉浣犻氲繃setsockopt璁剧疆浜呜诲啓瓒呮椂锛岃秴镞舵椂闂村埌浜呜缮鏄浼氲繑锲-1鍜孍AGAIN锛屼笉鍐岖浔瑙夌瓑寰咃级

闱为樆濉炲氨鏄痳ecv/read镄勬椂鍊欙纴瑕佹槸鎺ユ敹缂揿啿鍖烘湁鏁版嵁鎴戝氨璇诲畬锛屾病链夋暟鎹鎴戠洿鎺ュ甫镌杩斿洖镄-1鍜孍GAIN璧颁汉锛岀粷涓岖浔瑙夌瓑寰呰借镞堕棿銆

write/send镄勬椂鍊欙纴瑕佹槸鍙戦佺紦鍐插尯链夎冻澶熺殑绌洪棿锛屽氨绔嫔埢鎶婃暟鎹濉炲埌鍙戦佺紦鍐插尯铡伙纴铹跺悗璧颁汉锛屽傛灉鍙戦佺紦瀛桦尯婊′简锛岀┖闂翠笉瓒筹纴闾g洿鎺ュ甫镌杩斿洖镄-1鍜孍AGAIN璧颁汉銆傝呖浜嶪O澶氲矾澶岖敤锛岄栧厛瑕佺悊瑙g殑鏄锛屾搷浣灭郴缁熶负浣犳彁渚涗简涓涓锷熻兘锛屽綋浣犵殑镆愪釜socket鎺ユ敹缂揿瓨鍖烘湁鏁版嵁鍙璇伙纴鎴栬呭彂阃佺紦鍐插尯链夌┖闂村彲鍐欑殑镞跺欙纴瀹冨彲浠ョ粰浣犱竴涓阃氱煡銆

杩欐牱褰挞厤钖堥潪阒诲炵殑socket浣跨敤镞讹纴鍙链夊綋绯荤粺阃氱煡鎴戝摢涓鎻忚堪绗﹀彲璇讳简锛屾垜镓嶅幓镓ц宺ead镎崭綔锛屽彲浠ヤ缭璇佹疮娆read閮借兘璇诲埌链夋晥鏁版嵁钥屼笉锅氱函杩斿洖-1鍜孍AGAIN镄勬棤鐢ㄥ姛銆

鍐欐搷浣灭被浼笺

镎崭綔绯荤粺镄勮繖涓锷熻兘阃氲繃select/poll/epoll涔嬬被镄勭郴缁熻皟鐢ㄥ嚱鏁版潵浣跨敤锛岃繖浜涘嚱鏁伴兘鍙浠ュ悓镞剁洃瑙嗗氢釜鎻忚堪绗︾殑璇诲啓灏辩华鐘跺喌锛岃繖镙凤纴澶氢釜鎻忚堪绗︾殑I/O镎崭綔閮借兘鍦ㄤ竴涓绾跨▼鍐呭畬鎴愶纴杩椤氨鍙献/O澶氲矾澶岖敤锛岃繖閲岀殑钬滃岖敤钬濇寚镄勬槸澶岖敤钖屼竴涓绾跨▼銆傝呖浜庝簨浠堕┍锷锛屽叾瀹炴槸I/O澶氲矾澶岖敤镄勪竴涓鍙﹀栫殑绉板懠銆傝呖浜庡纾姝ュ悓姝ワ纴鎴戜滑甯歌佺殑linux涓嬬殑缃戠粶缂栫▼妯″瀷澶ч儴鍒嗛兘鏄钖屾io锛屼互璇绘搷浣滀负渚嬶纴链璐ㄤ笂閮芥槸闇瑕佺敤鎴疯皟鐢╮ead/recv铡讳粠鍐呮牳缂揿啿鍖烘妸鏁版嵁璇诲畬鍐嶅勭悊涓氩姟阃昏緫銆

寮傛io鍒欐槸鍐呮牳宸茬粡鎶婃暟鎹璇诲ソ浜嗭纴鐢ㄦ埛鐩存帴澶勭悊阃昏緫銆

寮傛IO鍦╨inux涓嬩竴鑸鏄鐢╝io搴撱

linuxaccept()鍑芥暟涓鐩村勪簬阒诲炵姸镐,浠涔埚师锲狅纻

accept锛堬级鍑芥暟灏辨槸阒诲炵殑鍟婏纴瑕佺瓑寰呮帴鏀跺埌链夊㈡埛绔璇锋眰镓嶅彲浠ヨ繘琛屽悗缁镄勬搷浣滐纴浣犳墍璋撶殑涓嶅彲浠ユ槸鎸囦粈涔堬纻

open绯荤粺浣跨敤鎶宸э纻

open绯荤粺鏄澶氱嶈瑷銆佺幆澧幂殑涓绉嶅嚱鏁般

LINUX涓璷pen鍑芥暟浣灭敤锛氭墦寮鍜屽垱寤烘枃浠躲侾B绋嫔簭璇瑷涓璷pen锷熻兘锛氭墦寮绐楀彛銆

瀵逛簬open绯荤粺𨱒ヨ达纴绗涓変釜鍙傛暟浠呭綋鍒涘缓鏂版枃浠舵椂锛埚嵆浣跨敤浜哋_CREAT镞讹级镓崭娇鐢锛岀敤浜庢寚瀹氭枃浠剁殑璁块梾𨱒冮檺浣嶃

pathname鏄寰呮墦寮/鍒涘缓鏂囦欢镄凯OSIX璺寰勫悕锛沠lags鐢ㄤ簬鎸囧畾鏂囦欢镄勬墦寮/鍒涘缓妯″纺锛岃繖涓鍙傛暟鍙鐢变互涓嫔父閲忛氲繃阃昏緫浣嶆垨阃昏緫鏋勬垚銆

镓揿紑/鍒涘缓鏂囦欢镞讹纴镊冲皯寰椾娇鐢ㄤ笂杩颁笁涓甯搁噺涓镄勪竴涓銆

浠ヤ笅甯搁噺鏄阃夌敤镄勶细

1.璁剧疆涓洪潪阒诲炴ā寮

2.浠ヤ笅涓変釜甯搁噺钖屾牱鏄阃夌敤镄勶纴瀹冧滑鐢ㄤ簬钖屾ヨ緭鍏ヨ緭鍑

3.open杩斿洖镄勬枃浠舵弿杩扮︿竴瀹氭槸链灏忕殑链琚浣跨敤镄勬弿杩扮︺

阅读全文

与linuxopencreat相关的资料

热点内容
小学乐高机器人编程作品 浏览:522
小猿搜题app怎么使用 浏览:418
内孔左螺纹编程 浏览:891
怎么查找程序员信息 浏览:536
adb日志导出到本地的命令 浏览:715
手机微信压缩包 浏览:261
坐高铁应下什么app 浏览:527
命令行查找文件夹 浏览:389
快递加密个人信息 浏览:828
怎么开对应用的加密 浏览:201
备用安卓手机怎么用 浏览:585
数据分析与应用黑马程序员 浏览:485
单片机触摸屏屏编程 浏览:403
java实现base64 浏览:906
小傻瓜怎么连接服务器 浏览:650
cnc编程用什么牌子电脑 浏览:774
程序员酒局 浏览:60
两张图片怎么合成pdf 浏览:840
android项目编译打包流程 浏览:36
云服务器怎么连监控 浏览:54