apue第一章 (2)

我的理想是:“让我的家人过的更好”

10ansi c

Ansi = American national standard institute 美国国家标准协会

Ansi c ansic语言进行的标准化。

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中每一个用户都有一个用户idpasswd中出现,也有一个或者多个组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:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值