1、一)文献操作篇
1、creat(建立文献)
头文献
1 #include
2、 返回值 creat()会返回新的文献描述词,若有错误发生则会返回-1,并把错误代码设给errno。 EEXIST 参数pathname所指的文献已存在。 EACCESS 参数pathname 所指定的文献不符合所规定测试的权限 EROFS 欲打开写入权限的文献存在于只读文献系统内 EFAULT 参数pathname 指针超过可存取的内存空间 EINVAL 参数mode 不对的。 ENAMETOOLONG 参数pathname太长。 ENOTDIR 参数pathname为一目录 ENOMEM 核心内存局限性 ELOOP 参数pathname有过多符号连接问题。 EMF
3、ILE 已达成进程可同时打开的文献数上限
ENFILE 已达成系统可同时打开的文献数上限
附加说明
creat()无法建立特别的装置文献,假如需要请使用mknod()。
2、open(打开文献)
头文献
1 #include
4、pathname 指向欲打开的文献途径字符串。下列是参数flags 所能使用的旗标: O_RDONLY 以只读方式打开文献 O_WRONLY 以只写方式打开文献 O_RDWR 以可读写方式打开文献。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标运用OR(|)运算符组合。 O_CREAT 若欲打开的文献不存在则自动建立该文献。 O_EXCL 假如O_CREAT 也被设立,此指令会去检查文献是否存在。文献若不存在则建立该文献,否则将导致打开文献错误。此外,若O_CREAT与O_EXCL同时设立,并且欲打开的文献为符号连接,则会打开文献失败。 O_NOCTTY 假如欲打开的文
5、献为终端机设备时,则不会将该终端机当成进程控制终端机。 O_TRUNC 若文献存在并且以可写的方式打开时,此旗标会令文献长度清为0,而本来存于该文献的资料也会消失。 O_APPEND 当读写文献时会从文献尾开始移动,也就是所写入的数据会以附加的方式加入到文献后面。 O_NONBLOCK 以不可阻断的方式打开文献,也就是无论有无数据读取或等待,都会立即返回进程之中。 O_NDELAY 同O_NONBLOCK。 O_SYNC 以同步的方式打开文献。 O_NOFOLLOW 假如参数pathname 所指的文献为一符号连接,则会令打开文献失败。 O_DIRECTORY 假如参数pathn
6、ame 所指的文献并非为一目录,则会令打开文献失败。 此为Linux2.2以后特有的旗标,以避免一些系统安全问题。参数mode 则有下列数种组合,只有在建立新文献时才会生效,此外真正建文献时的权限会受到umask值所影响,因此该文献权限应当为(mode-umaks)。 S_IRWXU00700 权限,代表该文献所有者具有可读、可写及可执行的权限。 S_IRUSR 或S_IREAD,00400权限,代表该文献所有者具有可读取的权限。 S_IWUSR 或S_IWRITE,00200 权限,代表该文献所有者具有可写入的权限。 S_IXUSR 或S_IEXEC,00100 权限,代表该文献所
7、有者具有可执行的权限。 S_IRWXG 00070权限,代表该文献用户组具有可读、可写及可执行的权限。 S_IRGRP 00040 权限,代表该文献用户组具有可读的权限。 S_IWGRP 00020权限,代表该文献用户组具有可写入的权限。 S_IXGRP 00010 权限,代表该文献用户组具有可执行的权限。 S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。 S_IROTH 00004 权限,代表其他用户具有可读的权限 S_IWOTH 00002权限,代表其他用户具有可写入的权限。 S_IXOTH 00001 权限,代表其他用户具有可执行的权限。 返回
8、值 若所有欲核查的权限都通过了检查则返回0 值,表达成功,只要有一个权限被严禁则返回-1。 错误代码 EEXIST 参数pathname 所指的文献已存在,却使用了O_CREAT和O_EXCL旗标。 EACCESS 参数pathname所指的文献不符合所规定测试的权限。 EROFS 欲测试写入权限的文献存在于只读文献系统内。 EFAULT 参数pathname指针超过可存取内存空间。 EINVAL 参数mode 不对的。 ENAMETOOLONG 参数pathname太长。 ENOTDIR 参数pathname不是目录。 ENOMEM 核心内存局限性。 ELOOP 参数p
9、athname有过多符号连接问题。
EIO I/O 存取错误
3、close(关闭文献)
头文献
1 #include
10、但仍建议自行关闭文献,并的确检查返回值。
4、read(由已打开的文献读取数据)
头文献
1 #include
11、与参数count 作比较,若返回的字节数比规定读取的字节数少,则有也许读到了文献尾、从管道(pipe)或终端机读取,或者是read()被信号中断了读取动作。当有错误发生时则返回-1,错误代码存入errno中,而文献读写位置则无法预期。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EBADF 参数fd 非有效的文献描述词,或该文献已关闭。
5、write(将数据写入已打开的文献内)
头文献
1 #include
12、 fd,const void * buf,size_t count);
函数说明
write()会把参数buf所指的内存写入count个字节到参数fd所指的文献内。当然,文献读写位置也会随之移动。
返回值
假如顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno中。
错误代码
EINTR 此调用被信号所中断。
EAGAIN 当使用不可阻断I/O 时(O_NONBLOCK),若无数据可读取则返回此值。
EADF 参数fd非有效的文献描述词,或该文献已关闭。
6、flock(锁定文献或解除锁定)
头文献
1 #include 13、file.h>
定义函数
1 int flock(int fd,int operation);
函数说明
flock()会依参数operation所指定的方式对参数fd所指的文献做各种锁定或解除锁定的动作。此函数只能锁定整个文献,无法锁定文献的某一区域。
参数
operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文献作共享锁定。
LOCK_EX 建立互斥锁定。一个文献同时只有一个互斥锁定。
LOCK_UN 解除文献锁定状态。
LOCK_NB 无法建立锁定期,此操作可不被阻断,立即返回进程。通常与LOCK_SH或LOCK_EX 做OR 14、)组合。
单一文献无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文献描述词不会继承此种锁定。
返回值
返回0表达成功,若有错误则返回-1,错误代码存于errno。
7、lseek(移动文献的读写位置)
头文献
1 #include 15、),则读写位置会指向文献尾。当read()或write()时,读写位置会随之增长,lseek()便是用来控制该文献的读写位置。参数fildes 为已打开的文献描述词,参数offset 为根据参数whence来移动读写位置的位移数。
参数
whence为下列其中一种:
SEEK_SET 参数offset即为新的读写位置。
SEEK_CUR 以目前的读写位置往后增长offset个位移量。
SEEK_END 将读写位置指向文献尾后再增长offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
下列是教特别的使用方式:
1) 欲 16、将读写位置移到文献开头时:lseek(int fildes,0,SEEK_SET);
2) 欲将读写位置移到文献尾时:lseek(int fildes,0,SEEK_END);
3) 想要取得目前文献位置时:lseek(int fildes,0,SEEK_CUR);
返回值
当调用成功时则返回目前的读写位置,也就是距离文献开头多少个字节。若有错误则返回-1,errno 会存放错误代码。
附加说明
Linux系统不允许lseek()对tty装置作用,此项动作会令lseek()返回ESPIPE。
8、fcntl(文献描述词操作)
头文献
1 #include 17、
2 #include 18、)。F_GETFD取得close-on-exec旗标。若此旗标的FD_CLOEXEC位为0,代表在调用exec()相关函数时文献将不会关闭。
F_SETFD 设立close-on-exec 旗标。该旗标以参数arg 的FD_CLOEXEC位决定。
F_GETFL 取得文献描述词状态旗标,此旗标为open()的参数flags。
F_SETFL 设立文献描述词状态旗标,参数arg为新旗标,但只允许O_APPEND、O_NONBLOCK和O_ASYNC位的改变,其他位的改变将不受影响。
F_GETLK 取得文献锁定的状态。
F_SETLK 设立文献锁定的状态。此时flcok 结构的l_ty 19、pe 值必须是F_RDLCK、F_WRLCK或F_UNLCK。假如无法建立锁定,则返回-1,错误代码为EACCES 或EAGAIN。
F_SETLKW F_SETLK 作用相同,但是无法建立锁定期,此调用会一直等到锁定动作成功为止。若在等待锁定的过程中被信号中断时,会立即返回-1,错误代码为EINTR。参数lock指针为flock 结构指针,定义如下
1 struct flcok
2 {
3 short int l_type; /* 锁定的状态*/
4 short int l_whence;/*决定l_start位置*/
5 off_t l_start; 20、 /*锁定区域的开头位置*/
6 off_t l_len; /*锁定区域的大小*/
7 pid_t l_pid; /*锁定动作的进程*/
8 };
l_type 有三种状态:
F_RDLCK 建立一个供读取用的锁定
F_WRLCK 建立一个供写入用的锁定
F_UNLCK 删除之前建立的锁定
l_whence 也有三种方式:
SEEK_SET 以文献开头为锁定的起始位置。
SEEK_CUR 以目前文献读写位置为锁定的起始位置
SEEK_END 以文献结尾为锁定的起始位置。
返回值
成功则返回0,若有错误则返回-1,错误因素存于errno.
9、 21、fgets(由文献中读取一字符串)
头文献
1 include 22、 int fputs(const char * s,FILE * stream);
函数说明
fputs()用来将参数s所指的字符串写入到参数stream所指的文献内。
返回值
若成功则返回写出的字符个数,返回EOF则表达有错误发生。
(二)内存控制篇
1、calloc(配置内存空间)
头文献
1 #include 23、下列的方式效果相同:malloc(nmemb*size);但是,在运用calloc()配置内存时会将内存内容初始化为0。
返回值
若配置成功则返回一指针,失败则返回NULL。
2、free(释放原先配置的内存)
头文献
1 #include 24、若参数ptr为NULL,则free()不会有任何作用。
3、malloc(配置内存空间)
头文献
1 #include 25、onst char * path,const char * arg,....);
函数说明
execl()用来执行参数path字符串所代表的文献途径,接下来的参数代表执行该文献时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
假如执行成功则函数不会返回,执行失败则直接返回-1,失败因素存于errno中。
2、execlp(从PATH 环境变量中查找文献并执行)
头文献
#include 26、
函数说明
execlp()会从PATH 环境变量所指的目录中查找符合参数file的文献名,找到后便执行该文献,然后将第二个以后的参数当做该文献的argv[0]、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值
假如执行成功则函数不会返回,执行失败则直接返回-1,失败因素存于errno 中。
错误代码
参考execve()。
3、execv(执行文献)
头文献
1 #include 27、xecv()用来执行参数path字符串所代表的文献途径,与execl()不同的地方在于execve()只需两个参数,第二个参数运用数组指针来传递给执行文献。
返回值
假如执行成功则函数不会返回,执行失败则直接返回-1,失败因素存于errno 中。
错误代码
请参考execve()。
4、execve(执行文献)
头文献
1 #include 28、filename字符串所代表的文献途径,第二个参数系运用数组指针来传递给执行文献,最后一个参数则为传递给执行文献的新环境变量数组。
返回值
假如执行成功则函数不会返回,执行失败则直接返回-1,失败因素存于errno 中。
错误代码
EACCES
1. 欲执行的文献不具有用户可执行的权限。
2. 欲执行的文献所属的文献系统是以noexec 方式挂上。
3.欲执行的文献或script翻译器非一般文献。
EPERM
1.进程处在被追踪模式,执行者并不具有root权限,欲执行的文献具有SUID 或SGID 位。
2.欲执行的文献所属的文献系统是以nosuid方式挂上,欲执行的文献具 29、有SUID 或SGID 位元,但执行者并不具有root权限。
E2BIG 参数数组过大
ENOEXEC 无法判断欲执行文献的执行文献格式,有也许是格式错误或无法在此平台执行。
EFAULT 参数filename所指的字符串地址超过可存取空间范围。
ENAMETOOLONG 参数filename所指的字符串太长。
ENOENT 参数filename字符串所指定的文献不存在。
ENOMEM 核心内存局限性
ENOTDIR 参数filename字符串所包含的目录途径并非有效目录
EACCES 参数filename字符串所包含的目录途径无法存取,权限局限性
ELOOP 过多的符号连接 30、
ETXTBUSY 欲执行的文献已被其他进程打开并且正把数据写入该文献中
EIO I/O 存取错误
ENFILE 已达成系统所允许的打开文献总数。
EMFILE 已达成系统所允许单一进程所能打开的文献总数。
EINVAL 欲执行文献的ELF执行格式不只一个PT_INTERP节区
EISDIR ELF翻译器为一目录
ELIBBAD ELF翻译器有问题。
5、execvp(执行文献)
头文献
1 #include 31、xecvp()会从PATH 环境变量所指的目录中查找符合参数file 的文献名,找到后便执行该文献,然后将第二个参数argv传给该欲执行的文献。
返回值
假如执行成功则函数不会返回,执行失败则直接返回-1,失败因素存于errno中。
错误代码
请参考execve()。
6、exit(正常结束进程)
头文献
1 #include 32、束进程执行)
头文献
1 #include 33、d);
函数说明
vfork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文献代码、工作目录和资源限制等。Linux 使用copy-on-write(COW)技术,只有当其中一进程试图修改欲复制的空间时才会做真正的复制动作,由于这些继承的信息是复制而来,并非指相同的内存空间,因此子进程对这些变量的修改和父进程并不会同步。此外,子进程不会继承父进程的文献锁定和未解决的信号。注意,Linux不保证子进程会比父进程先执行或晚执行,因此编写程序时要留意
死锁或竞争条件的发生。
返回值
假如vfork()成功则在父进程会返回 34、新建立的子进程代码(PID),而在新建立的子进程中则返回0。假如vfork 失败则直接返回-1,失败因素存于errno中。
错误代码
EAGAIN 内存局限性。ENOMEM 内存局限性,无法配置核心所需的数据结构空间。
9、getpid(取得进程辨认码)
头文献
1 #include 35、头文献
1 #include 36、程结束状态值。子进程的结束状态值会由参数status 返回,而子进程的进程辨认码也会一快返回。假如不在意结束状态值,则
参数
status可以设成NULL。子进程的结束状态值请参考waitpid()。
返回值
假如执行成功则返回子进程辨认码(PID),假如有错误发生则返回-1。失败因素存于errno中。
12、waitpid(等待子进程中断或结束)
头文献
1 #include 37、函数说明
waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。假如在调用wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。子进程的结束状态值会由参数status返回,而子进程的进程辨认码也会一快返回。假如不在意结束状态值,则参数status可以设成 NULL。参数pid为欲等待的子进程辨认码,其他数值意义如下:
pid<-1 等待进程组辨认码为pid绝对值的任何子进程。
pid=-1 等待任何子进程,相称于wait()。
pid=0 等待进程组辨认码与目前进程相同的任何子进程。
pid>0 等待任何子进程辨认码为pid的子进程。
参数opt 38、ion可认为0 或下面的OR 组合
WNOHANG 假如没有任何已经结束的子进程则立即返回,不予以等待。
WUNTRACED 假如子进程进入暂停执行情况则立即返回,但结束状态不予以理睬。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况
WIFEXITED(status)假如子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED 来判断是否正常结束才干使用此宏。
WIFSIGNALED(status)假如子进程是由于信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信 39、号而中止的信号代码,一般会先用WIFSIGNALED 来判断后才使用此宏。
WIFSTOPPED(status)假如子进程处在暂停执行情况则此宏值为真。一般只有使用WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED 来判断后才使用此宏。
返回值
假如执行成功则返回子进程辨认码(PID),假如有错误发生则返回-1。失败因素存于errno中。
(四)信号解决篇
1、sigaction(查询或设立信号解决方式)
头文献
1 #include 40、action(int signum,const struct sigaction *act ,struct sigaction *oldact);
函数说明
sigaction()会依参数signum指定的信号编号来设立该信号的解决函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
如参数结构sigaction定义如下
1 struct sigaction
2 {
3 void (*sa_handler) (int);
4 sigset_t sa_mask;
5 int sa_flags;
6 void (*sa 41、restorer) (void);
7 }
sa_handler此参数和signal()的参数handler相同,代表新的信号解决函数,其他意义请参考signal()。
sa_mask 用来设立在解决该信号时暂时将sa_mask 指定的信号搁置。
sa_restorer 此参数没有使用。
sa_flags 用来设立信号解决的其他相关操作,下列的数值可用。
OR 运算(|)组合
A_NOCLDSTOP : 假如参数signum为SIGCHLD,则当子进程暂停时并不会告知父进程
SA_ONESHOT/SA_RESETHAND:当调用新的信号解决函数前,将此信号解决方式改为系 42、统预设的方式。
SA_RESTART:被信号中断的系统调用会自行重启
SA_NOMASK/SA_NODEFER:在解决此信号未结束前不理睬此信号的再次到来。
假如参数oldact不是NULL指针,则本来的信号解决方式会由此结构sigaction 返回。
返回值
执行成功则返回0,假如有错误则返回-1。
错误代码
EINVAL 参数signum 不合法, 或是企图拦截SIGKILL/SIGSTOPSIGKILL信号
EFAULT 参数act,oldact指针地址无法存取。
EINTR 此调用被中断
2、sigaddset(增长一个信号至信号集)
头文献
1 #inclu 43、de 44、);
函数说明
sigdelset()用来将参数signum代表的信号从参数set信号集里删除。
返回值
执行成功则返回0,假如有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum非合法的信号编号
4、sigemptyset(初始化信号集)
头文献
1 #include 45、EFAULT 参数set指针地址无法存取
5、sigfillset(将所有信号加入至信号集)
头文献
1 #include 46、nt sigismember(const sigset_t *set,int signum);
函数说明
sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。假如信号集里已有该信号则返回1,否则返回0。
返回值
信号集已有该信号则返回1,没有则返回0。假如有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum 非合法的信号编号
7、signal(设立信号解决方式)
头文献
1 #include 47、m,void(* handler)(int)))(int);
函数说明
signal()会依参数signum 指定的信号编号来设立该信号的解决函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。假如
参数handler不是函数指针,则必须是下列两个常数之一:
SIG_IGN 忽略参数signum指定的信号。
SIG_DFL 将参数signum 指定的信号重设为核心预设的信号解决方式。
关于信号的编号和说明,请参考附录D
返回值
返回先前的信号解决函数指针,假如有错误则返回SIG_ERR(-1)。
附加说明
在信号发生跳转到自定的handler解决函数执行后 48、系统会自动将此解决函数换回本来系统预设的解决方式,假如要改变此操作请改用
sigaction()。
8、sleep(让进程暂停执行一段时间)
头文献
1 #include 49、 50、
mkfifo()会依参数pathname建立特殊的FIFO文献,该文献必须不存在,而参数mode为该文献的权限(mode%~umask),因此 umask值也会
影响到FIFO文献的权限。Mkfifo()建立的FIFO文献其他进程都可以用读写一般文献的方式存取。当使用open()来打开 FIFO文献时,
O_NONBLOCK旗标会有影响
1、当使用O_NONBLOCK 旗标时,打开FIFO 文献来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文献来读取,则写入的操作会
返回ENXIO 错误代码。
2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其






