分享
 
 
 

linux 下C函数部分(17)

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

rewinddir(重设读取目录的位置为开头位置)

相关函数

open,opendir,closedir,telldir,seekdir,readdir,scandir

表头文件

#include<sys/types.h>

#include<dirent.h>

定义函数

void rewinddir(DIR *dir);

函数说明

rewinddir()用来设置参数dir 目录流目前的读取位置为原来开头的读取位置。

返回值

错误代码

EBADF dir为无效的目录流

范例

#include<sys/types.h>

#include<dirent.h>

#include<unistd.h>

main()

{

DIR * dir;

struct dirent *ptr;

dir = opendir(“/etc/rc.d”);

while((ptr = readdir(dir))!=NULL)

{

printf(“d_name :%s\n”,ptr->d_name);

}

rewinddir(dir);

printf(“readdir again!\n”);

while((ptr = readdir(dir))!=NULL)

{

printf(“d_name: %s\n”,ptr->d_name);

}

closedir(dir);

}

执行

d_name:.

d_name:..

d_name:init.d

d_name:rc0.d

d_name:rc1.d

d_name:rc2.d

d_name:rc3.d

d_name:rc4.d

d_name:rc5.d

d_name:rc6.d

d_name:rc

d_name:rc.local

d_name:rc.sysinit

readdir again!

d_name:.

d_name:..

d_name:init.d

d_name:rc0.d

d_name:rc1.d

d_name:rc2.d

d_name:rc3.d

d_name:rc4.d

d_name:rc5.d

d_name:rc6.d

d_name:rc

d_name:rc.local

d_name:rc.sysinit

seekdir(设置下回读取目录的位置)

相关函数

open,opendir,closedir,rewinddir,telldir,readdir,scandir

表头文件

#include<dirent.h>

定义函数

void seekdir(DIR * dir,off_t offset);

函数说明

seekdir()用来设置参数dir目录流目前的读取位置,在调用readdir()时便从此新位置开始读取。参数offset 代表距离目录文件开头的偏移量。

返回值

错误代码

EBADF 参数dir为无效的目录流

范例

#include<sys/types.h>

#include<dirent.h>

#include<unistd.h>

main()

{

DIR * dir;

struct dirent * ptr;

int offset,offset_5,i=0;

dir=opendir(“/etc/rc.d”);

while((ptr = readdir(dir))!=NULL)

{

offset = telldir(dir);

if(++i = =5) offset_5 =offset;

printf(“d_name :%s offset :%d \n”,ptr->d_name,offset);

}

seekdir(dir offset_5);

printf(“Readdir again!\n”);

while((ptr = readdir(dir))!=NULL)

{

offset = telldir(dir);

printf(“d_name :%s offset :%d\n”,ptr->d_name.offset);

}

closedir(dir);

}

执行

d_name : . offset :12

d_name : .. offset:24

d_name : init.d offset 40

d_name : rc0.d offset :56

d_name :rc1.d offset :72

d_name:rc2.d offset :88

d_name:rc3.d offset 104

d_name:rc4.d offset:120

d_name:rc5.d offset:136

d_name:rc6.d offset:152

d_name:rc offset 164

d_name:rc.local offset :180

d_name:rc.sysinit offset :4096

readdir again!

d_name:rc2.d offset :88

d_name:rc3.d offset 104

d_name:rc4.d offset:120

d_name:rc5.d offset:136

d_name:rc6.d offset:152

d_name:rc offset 164

d_name:rc.local offset :180

d_name:rc.sysinit offset :4096

stat(取得文件状态)

相关函数

fstat,lstat,chmod,chown,readlink,utime

表头文件

#include<sys/stat.h>

#include<unistd.h>

定义函数

int stat(const char * file_name,struct stat *buf);

函数说明

stat()用来将参数file_name所指的文件状态,复制到参数buf所指的结构中。

下面是struct stat内各参数的说明

struct stat

{

dev_t st_dev; /*device*/

ino_t st_ino; /*inode*/

mode_t st_mode; /*protection*/

nlink_t st_nlink; /*number of hard links */

uid_t st_uid; /*user ID of owner*/

gid_t st_gid; /*group ID of owner*/

dev_t st_rdev; /*device type */

off_t st_size; /*total size, in bytes*/

unsigned long st_blksize; /*blocksize for filesystem I/O */

unsigned long st_blocks; /*number of blocks allocated*/

time_t st_atime; /* time of lastaccess*/

time_t st_mtime; /* time of last modification */

time_t st_ctime; /* time of last change */

};

st_dev 文件的设备编号

st_ino 文件的i-node

st_mode 文件的类型和存取的权限

st_nlink 连到该文件的硬连接数目,刚建立的文件值为1。

st_uid 文件所有者的用户识别码

st_gid 文件所有者的组识别码

st_rdev 若此文件为装置设备文件,则为其设备编号

st_size 文件大小,以字节计算

st_blksize 文件系统的I/O 缓冲区大小。

st_blcoks 占用文件区块的个数,每一区块大小为512 个字节。

st_atime 文件最近一次被存取或被执行的时间,一般只有在用mknod、utime、read、write与tructate时改变。

st_mtime 文件最后一次被修改的时间,一般只有在用mknod、utime和write时才会改变

st_ctime i-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新先前所描述的st_mode 则定义了下列数种情况

S_IFMT 0170000 文件类型的位遮罩

S_IFSOCK 0140000 scoket

S_IFLNK 0120000 符号连接

S_IFREG 0100000 一般文件

S_IFBLK 0060000 区块装置

S_IFDIR 0040000 目录

S_IFCHR 0020000 字符装置

S_IFIFO 0010000 先进先出

S_ISUID 04000 文件的(set user-id on execution)位

S_ISGID 02000 文件的(set group-id on execution)位

S_ISVTX 01000 文件的sticky位

S_IRUSR(S_IREAD) 00400 文件所有者具可读取权限

S_IWUSR(S_IWRITE)00200 文件所有者具可写入权限

S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限

S_IRGRP 00040 用户组具可读取权限

S_IWGRP 00020 用户组具可写入权限

S_IXGRP 00010 用户组具可执行权限

S_IROTH 00004 其他用户具可读取权限

S_IWOTH 00002 其他用户具可写入权限

S_IXOTH 00001 其他用户具可执行权限

上述的文件类型在POSIX 中定义了检查这些类型的宏定义

S_ISLNK (st_mode) 判断是否为符号连接

S_ISREG (st_mode) 是否为一般文件

S_ISDIR (st_mode)是否为目录

S_ISCHR (st_mode)是否为字符装置文件

S_ISBLK (s3e) 是否为先进先出

S_ISSOCK (st_mode) 是否为socket

若一目录具有sticky 位(S_ISVTX),则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除或改名。

返回值

执行成功则返回0,失败返回-1,错误代码存于errno

错误代码

ENOENT 参数file_name指定的文件不存在

ENOTDIR 路径中的目录存在但却非真正的目录

ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接

EFAULT 参数buf为无效指针,指向无法存在的内存空间

EACCESS 存取文件时被拒绝

ENOMEM 核心内存不足

ENAMETOOLONG 参数file_name的路径名称太长

范例

#include<sys/stat.h>

#include<unistd.h>

mian()

{

struct stat buf;

stat (“/etc/passwd”,&buf);

printf(“/etc/passwd file size = %d \n”,buf.st_size);

}

执行

/etc/passwd file size = 705

symlink(建立文件符号连接)

相关函数

link,unlink

表头文件

#include<unistd.h>

定义函数

int symlink( const char * oldpath,const char * newpath);

函数说明

symlink()以参数newpath指定的名称来建立一个新的连接(符号连接)到参数oldpath所指定的已存在文件。参数oldpath指定的文件不一定要存在,如果参数newpath指定的名称为一已存在的文件则不会建立连接。

返回值

成功则返回0,失败返回-1,错误原因存于errno。

错误代码

EPERM 参数oldpath与newpath所指的文件系统不支持符号连接

EROFS 欲测试写入权限的文件存在于只读文件系统内

EFAULT 参数oldpath或newpath指针超出可存取内存空间。

ENAMETOOLONG 参数oldpath或newpath太长

ENOMEM 核心内存不足

EEXIST 参数newpath所指的文件名已存在。

EMLINK 参数oldpath所指的文件已达到最大连接数目

ELOOP 参数pathname有过多符号连接问题

ENOSPC 文件系统的剩余空间不足

EIO I/O 存取错误

范例

#include<unistd.h>

main()

{

symlink(“/etc/passwd”,”pass”);

}

telldir(取得目录流的读取位置)

相关函数

open,opendir,closedir,rewinddir,seekdir,readdir,scandir

表头文件

#include<dirent.h>

定义函数

off_t telldir(DIR *dir);

函数说明

telldir()返回参数dir目录流目前的读取位置。此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置,有错误发生时返回-1。

错误代码

EBADF参数dir为无效的目录流。

范例

#include<sys/types.h>

#include<dirent.h>

#include<unistd.h>

main()

{

DIR *dir;

struct dirent *ptr;

int offset;

dir = opendir(“/etc/rc.d”);

while((ptr = readdir(dir))!=NULL)

{

offset = telldir (dir);

printf(“d_name : %s offset :%d\n”, ptr->d_name,offset);

}

closedir(dir);

}

执行

d_name : . offset :12

d_name : .. offset:24

d_name : init.d offset 40

d_name : rc0.d offset :56

d_name :rc1.d offset :72

d_name:rc2.d offset :88

d_name:rc3.d offset 104

d_name:rc4.d offset:120

d_name:rc5.d offset:136

d_name:rc6.d offset:152

d_name:rc offset 164

d_name:rc.local offset :180

d_name:rc.sysinit offset :4096

truncate(改变文件大小)

相关函数

open,ftruncate

表头文件

#include<unistd.h>

定义函数

int truncate(const char * path,off_t length);

函数说明

truncate()会将参数path 指定的文件大小改为参数length 指定的大小。如果原来的文件大小比参数length大,则超过的部分会被删去。

返回值

执行成功则返回0,失败返回-1,错误原因存于errno。

错误代码

EACCESS 参数path所指定的文件无法存取。

EROFS 欲写入的文件存在于只读文件系统内

EFAULT 参数path指针超出可存取内存空间

EINVAL 参数path包含不合法字符

ENAMETOOLONG 参数path太长

ENOTDIR 参数path路径并非一目录

EISDIR 参数path 指向一目录

ETXTBUSY 参数path所指的文件为共享程序,而且正被执行中

ELOOP 参数path’有过多符号连接问题

EIO I/O 存取错误。

umask(设置建立新文件时的权限遮罩)

相关函数

creat,open

表头文件

#include<sys/types.h>

#include<sys/stat.h>

定义函数

mode_t umask(mode_t mask);

函数说明

umask()会将系统umask值设成参数mask&0777后的值,然后将先前的umask值返回。在使用open()建立新文件时,该参数mode并非真正建立文件的权限,而是(mode&~umask)的权限值。例如,在建立文件时指定文件权限为0666,通常umask值默认为022,则该文件的真正权限则为0666&~022=0644,也就是rw-r--r--返回值此调用不会有错误值返回。返回值为原先系统的umask值。

unlink(删除文件)

相关函数

link,rename,remove

表头文件

#include<unistd.h>

定义函数

int unlink(const char * pathname);

函数说明

unlink()会删除参数pathname指定的文件。如果该文件名为最后连接点,但有其他进程打开了此文件,则在所有关于此文件的文件描述词皆关闭后才会删除。如果参数pathname为一符号连接,则此连接会被删除。

返回值

成功则返回0,失败返回-1,错误原因存于errno

错误代码

EROFS 文件存在于只读文件系统内

EFAULT 参数pathname指针超出可存取内存空间

ENAMETOOLONG 参数pathname太长

ENOMEM 核心内存不足

ELOOP 参数pathname 有过多符号连接问题

EIO I/O 存取错误

utime(修改文件的存取时间和更改时间)

相关函数

utimes,stat

表头文件

#include<sys/types.h>

#include<utime.h>

定义函数

int utime(const char * filename,struct utimbuf * buf);

函数说明

utime()用来修改参数filename文件所属的inode存取时间。

结构utimbuf定义如下

struct utimbuf{

time_t actime;

time_t modtime;

};

返回值

如果参数buf为空指针(NULL),则该文件的存取时间和更改时间全部会设为目前时间。

执行成功则返回0,失败返回-1,错误代码存于errno。

错误代码

EACCESS 存取文件时被拒绝,权限不足

ENOENT 指定的文件不存在。

utimes(修改文件的存取时间和更改时间)

相关函数

utime,stat

表头文件

#include<sys/types.h>

#include<utime.h>

定义函数

int utimes(char * filename.struct timeval *tvp);

函数说明

utimes()用来修改参数filename文件所属的inode存取时间和修改时间。

结构timeval定义如下

struct timeval {

long tv_sec;

long tv_usec; /* 微妙*/

};

返回值

参数tvp 指向两个timeval 结构空间,和utime()使用的utimebuf结构比较,tvp[0].tc_sec 则为utimbuf.actime,tvp]1].tv_sec 为utimbuf.modtime。

执行成功则返回0。失败返回-1,错误代码存于errno。

错误代码

EACCESS 存取文件时被拒绝,权限不足

ENOENT 指定的文件不存在

alarm(设置信号传送闹钟)

相关函数

signal,sleep

表头文件

#include<unistd.h>

定义函数

unsigned int alarm(unsigned int seconds);

函数说明

alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。

返回值

返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。

范例

#include<unistd.h>

#include<signal.h>

void handler() {

printf(“hello\n”);

}

main()

{

int i;

signal(SIGALRM,handler);

alarm(5);

for(i=1;i<7;i++){

printf(“sleep %d ...\n”,i);

sleep(1);

}

}

执行

sleep 1 ...

sleep 2 ...

sleep 3 ...

sleep 4 ...

sleep 5 ...

hello

sleep 6 ...

kill(传送信号给指定的进程)

相关函数

raise,signal

表头文件

#include<sys/types.h>

#include<signal.h>

定义函数

int kill(pid_t pid,int sig);

函数说明

kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:

pid>0 将信号传给进程识别码为pid 的进程。

pid=0 将信号传给和目前进程相同进程组的所有进程

pid=-1 将信号广播传送给系统内所有的进程

pid<0 将信号传给进程组识别码为pid绝对值的所有进程

参数sig代表的信号编号可参考附录D

返回值

执行成功则返回0,如果有错误则返回-1。

错误代码

EINVAL 参数sig 不合法

ESRCH 参数pid 所指定的进程或进程组不存在

EPERM 权限不够无法传送信号给指定进程

范例

#include<unistd.h>

#include<signal.h>

#include<sys/types.h>

#include<sys/wait.h>

main()

{

pid_t pid;

int status;

if(!(pid= fork())){

printf(“Hi I am child process!\n”);

sleep(10);

return;

}

else{

printf(“send signal to child process (%d) \n”,pid);

sleep(1);

kill(pid ,SIGABRT);

wait(&status);

if(WIFSIGNALED(status))

printf(“chile process receive signal %d\n”,WTERMSIG(status));

}

}

执行

sen signal to child process(3170)

Hi I am child process!

child process receive signal 6

pause(让进程暂停直到信号出现)

相关函数

kill,signal,sleep

表头文件

#include<unistd.h>

定义函数

int pause(void);

函数说明

pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。

返回值

只返回-1。

错误代码

EINTR 有信号到达中断了此函数。

sigaction(查询或设置信号处理方式)

相关函数

signal,sigprocmask,sigpending,sigsuspend

表头文件

#include<signal.h>

定义函数

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函数说明

sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。

如参数结构sigaction定义如下

struct sigaction

{

void (*sa_handler) (int);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer) (void);

}

sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。

sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。

sa_restorer 此参数没有使用。

sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。

OR 运算(|)组合

A_NOCLDSTOP : 如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程

SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式。

SA_RESTART:被信号中断的系统调用会自行重启

SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。

如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction 返回。

返回值

执行成功则返回0,如果有错误则返回-1。

第一頁    上一頁    第17頁/共20頁    下一頁    最後頁
第01頁 第02頁 第03頁 第04頁 第05頁 第06頁 第07頁 第08頁 第09頁 第10頁 
第11頁 第12頁 第13頁 第14頁 第15頁 第16頁 第17頁 第18頁 第19頁 第20頁 
 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有