我的理想是:“让我的家人过的更好”
10、ansi c
Ansi = American national standard institute 美国国家标准协会
Ansi c 是ansi对c语言进行的标准化。
Ansi c中 大多函数都是 使用的 void * 为指针参数,在使用的时候不用强制转换
例如 malloc 的原型 为 void* malloc(size_t)
当使用
float * ptr;
ptr = malloc(8*sizeof(float));时候不用强制转换。
同理 extern ssize_t write (int __fd, __const void *__buf, size_t __n) 也不用强制转换。
下面例子编译不会出任何warning
//mine1-1.c
#include<stdio.h>
#include<stdlib.h>
int main()
{
float * ptr;
ptr = malloc(8 * sizeof(float));
free(ptr);
return 0;
}
11、原始数据类型
像extern ssize_t write (int __fd, __const void *__buf, size_t __n) 中有ssize_t size_t 等数据类型,这是都是咋sys/type.h中定义的,带有_t的数据类型为原始数据类型,各个平台不一样,这样为了屏蔽平台的差异性。
12出错处理
在<errno.h>文件中有一个变量
#ifndef errno
extern int errno;
#endif
这个变量用于表示错误的类型
这些错误的类型都以宏的形式定义好,而且都以E开头。例如EACCES 表示访问权限有问题,ENOENT 表示字符串指向的文件不存在,等。注意:errno 只有在出现错误的时候才改变,所有只需要在出错时候检查。errno 不会等于0.
下面是常用的错误类型
E2BIG 参数数组过大
ENOEXEC 无法判断欲执行文件的执行文件格式,有可能是格式错误或无法在此平台执行。
EFAULT 参数filename所指的字符串地址超出可存取空间范围。
ENAMETOOLONG 参数filename所指的字符串太长。
ENOENT 参数filename字符串所指定的文件不存在。
ENOMEM 核心内存不足
ENOTDIR 参数filename字符串所包含的目录路径并非有效目录
EACCES 参数filename字符串所包含的目录路径无法存取,权限不足
ELOOP 过多的符号连接
ETXTBUSY 欲执行的文件已被其他进程打开而且正把数据写入该文件中
EIO I/O 存取错误
ENFILE 已达到系统所允许的打开文件总数。
EMFILE 已达到系统所允许单一进程所能打开的文件总数。
EINVAL 欲执行文件的ELF执行格式不只一个PT_INTERP节区
EISDIR ELF翻译器为一目录
ELIBBAD ELF翻译器有问题。
下面是一个例子:
/*出错处理*/
#include<errno.h>
#include<string.h>
#include<stdio.h>
int main()
{
/*打印 EACESS对应的字符串*/
fprintf(stderr,"%s/n",strerror(EACCES));
/*修改errno的值*/
errno = ENOENT;
/*打印当前errno 对应的字符串值*/
perror("enoent");
}
在string.h中有一个函数 char* strerror(int errno)可以返回一个错误值对相应的字符串提示。
在stdio.h中,perror(char * str)函数,在打印完字符串str后打印当前的errno对应的字符串。
12、用户id,组id
在linux中每一个用户都有一个用户id在passwd中出现,也有一个或者多个组id,在passwd中的组id是默认组id,一个用户也可以属于多个组。例如一个人可以是销售部的,也可以是售后部的。出了默认组id,一个用户的其他id叫扩展组id,放在/etc/group中
例如:
white@white-desktop:/etc$ cat group
root:x:0:
daemon:x:1:
bin:x:2:
………….
…………..
white:x:1000:
sambashare:x:122:white
winbindd_priv:x:123:
junjun:x:1001:
每一行由冒号分开,分别为:用户名,口令,组id,组内用户列表
例如sambashare:x:122:white white属于 sambashare所在的用户组。
我们可以使用 usermod –G groupname username 把一个用户加入到一个组中
例如:我们把junjun加入到sambashare(桑巴服务器)所在组中
root@white-desktop:/etc# usermod -G sambashare junjun
root@white-desktop:/etc# cat group
root:x:0:
daemon:x:1:
bin:x:2:
………………
………………
white:x:1000:
sambashare:x:122:white,junjun
winbindd_priv:x:123:
junjun:x:1001: