UNIX系统程序设计教程(3)

2019-02-15 23:59

#include

int main( int argc , char *argv[] ) {

DIR *fp;

struct dirent *p; fp=opendir(argv[1]);

while( (p=readdir(fp))!=NULL ) {

printf(%i %s\\n, p->d_ino , p->d_name ); }

closedir(fp); return 0; }

执行结果和上面一样。函数说明如下: #include

DIR *opendir( char *dirname ); 打开一个目录,成功时返回DIR结构体的地址,失败返回NULL

struct dirent *readdir( DIR *dirp ); 取得打开目录中下一个文件的信息,成功时返回下一个文件信息的地址,失败时,或者读至末尾时返回NULL

int closeidr( DIR *dirp ); 关闭目录,成功时返回0,失败时返回-1

注意:readdir在成功地读出一项之后,会自动指向下一项。假设你有如下程序: struct dirent *p; p=readdir(fp);

p++; //千万不要像这行这样写。你无法保证这目录里的文件信息是连续存放的。

你只要一遍一遍地用readir()这个函数就行了。它帮你全搞定

第五章:目录及文件操作

上一章我们说了一些UNIX的文件系统的物理构造。下面我们来看看具体怎么对文件进行操作。当然这里所说的文件及目录操作不是fopen()。呵呵。我们要做一些fopen办不到的事。

/* newer.c 比较参数所指定的两个文件 将其中新的文件的文件名输出来 */ #include #include #include

int main( int argc , char *argvp] ) {

struct stat buf[2] , *p ;

if( argc!=3 ) {

fprintf( stderr , Usage : %s file1 file2\\n , argv[0] ); exit(1); }

p=buf;

if( stat(argv[1],p)!=0 ) //取得第一个文件的信息 {

fprintf( stderr , %s not found !\\n , argv[1] ); exit(1); } p++;

if( stat(argv[2],p)!=0 ) //取得第二个文件的信息 {

fprintf( stderr , %s not found !\\n , argv[2] ); exit(1); }

if( buf[0].st_mtime > buf[1].st_mtime ) //比较最终更新时间 printf( %s\\n , argv[1] ); else

printf( %s\\n , argv[2] ); return 0; }

执行结果:

%newer afile bfile bfile

使用stat()函数,可以得到文件的信息。这些信息是在i node中保存的这个文件信息的一部分。得到的信息将会保存在stat.h中定义的stat型的结构体中。stat()函数解释如下: #include #include

int stat( char *path , struct stat *buf ); 返回值: 成功时:0 失败时:-1

我们再来写一个玩玩

#include #include #include

#define MASK 0555 //这个数字的意思等一下解释,他代表“可读”和“可执行” int main( int argc , char *argv[] ) {

struct stat buf[1]; mode_t mode; if( argc!=2 ) {

fprintf( stderr , Usage : %s file\\n , argv[0] ); exit(1); }

if( stat(argv[1],buf)!=0 ) {

fprintf( stderr , Cannot read i-node\\n ); exit(1); }

mode = ( buf[0].st_mode & MASK ); //计算文件新的权限标志 if ( chmod(argv[1],mode)!=0 ) //改变文件的权限标志 {

fprintf( stderr , Cannot change mode\\n ); exit(1); }

return 0; }

现在来解释一下0555这个数字的意思。

众所周知,UNIX是一个多用户多任务的操作系统。每个用户有自己的权限,这个权限限制了用户可以做哪些事,不可以做哪些事。对于文件来说,用户可以分成四类: root(根用户,超级用户)

这个用户是系统的管理呐,权限最大,可以随意读写任何文件。 owner(文件拥有者)

实际拥有文件的用户。文件属主。 group(组成员)

用户所在的用户组的成员 other

以上三类之外的其它用户

UNIX中,每个文件信息中包括一组9位的权限标志。分别给文件属主,用户组和其他用户指定对该文件的读、写和执行权。请看下面的例子: %ls -l /bin/ls

-rwxr-xr-x 1 root bin 27281 Aug 15 2002 /bin/ls*

重要是看-rwxr-xr-x,第一个 - 表示这是一个普通文件,这个位置也可以出现些别的字符,比方说目录的话这里会是 d 。而 l 表示一个链接。余下的9位可以分成三段,每段三位。本例中从左至右

rwx 表示文件的属主拥有文件的读,写,执行权

r-x 表示同组的用户拥有文件的读,执行权(注意 ,“写”权限的位置是一个 - ) r-x 表示其它的用户拥有文件的读,执行权

文件的访问权限还可以用三位8进制来表示。如上例

rwx r-x r-x 可以换成

111 101 101 (有该权限,则该位为1,否则为0)

换成8进制, 二进制的111是八进制的7 , 二进制的101是八进制的5。 现在看看0555是什么意思?就是说,可以读,可以写的意思。

把0555和原来文件的权限标志做与运算,得到的新的权限标志就是把原来的文件权限标志中所有的写权限全取消了。其余权限变。然后在程序中用chmod()把这个新的权限标志赋给文件即可。

chomd()函数用法如下: #include #include

int chmod( char *path , mode_t mode ); 返回值: 成功时:0 失败时:-1

关于目录,还有另一个比较有用的函数,即chdir()。用这个函数可以在程序中转换当前目录。 #include #include

int chdir( char *path ); 返回值: 成功时:0 失败时:-1

以上两章,简单地叙述了一下UNIX的文件系统以及在UNIX C中对文件的操作方法。并列举了常用的一些函数。

第六章:标准输入输出以及管道操作

标准输入输出大概所有的操作系统都差不多吧。从键盘输入。从屏幕输出。除非你用的还是打纸带的老家伙。呵呵。

主要说一下管道操作。注意:此处所说的管道操作不是 % cat -n test.c | more

这是在提示符状态下使用管道,把第一个程序(cat)的输出作为输入传给第二个程序(more)。我们现在要在程序中使用的管道原理与此相同。将某一个程序的输出变为另一个程序的输入。

做一个石头剪子布的程序。其中包括一个父程序和一个子程序。注意是两个程序,不是两个函数。也不是两个进程。不过因为父程序运行的时候要通过exec()函数来执行子程序。所以我们也可以把它看成是两个进程。

父进程取得用户的输入(石头S,剪子C,布P中的某一个,P=0,S=1,C=2)并通过管道传给子进程

子进程取得父进程传来的数字,加上自己的PID后做为种子数,生成一个随机数然后被3除,得出来一个余数是0、1或者2。再通过管道传回给父进程。

父进程根据两个数字(用户输入的,以及子进程传回来的)判定胜负,输出

/* parent. */ #include #include int main() {

int i , j , st , fd[2] ; pid_t pid ;

static int result[3][3]={1,0,2,2,1,0,0,1,2}; char argv1[3] , argv2[3] , ch ;

ch=getchar(); switch(ch) {

case 'P': i=0;break; case 'S': i=1;break; case 'C': i=2;break; default:

fprintf( stderr , Enter P , S or C , Please!\\n ); exit(1); }

if( pipe(fd)!=0 ) //建立管道 {

fprintf( stderr , PIPE Error !\\n ); exit(1); }

sprintf( argv1 , %d , fd[0] ); sprintf( argv1 , %d , fd[1] );

switch( pid=fork() ) // fork出一个新的进程,执行子程序 {

case 0:

if( execl(child,child,argv1,argv2,(char *)0) == (-1)) exit(1); //执行了子程序 break; case -1:

fprintf( stderr , fork Error !\\n ); exit(1) }

write( fd[1], &i , sizeof(i) ); //向管道写数据 wait( &st ); //等待子程序结束


UNIX系统程序设计教程(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:小学四年级乘法除法应用题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: