Linux文件操作

来源:互联网 发布:skycc营销软件怎么样 编辑:程序博客网 时间:2024/04/29 01:56

1.return和exit区别:

exit()代表退出该进程,exit(1)是出现错误时关闭该进程,exit(0)代表正常退出,exit代表的是系统调用级别的进程结束.

return代表的是这一层函数结束返回上一级函数,如果是main的return,就代表着程序的结束运行,它是调用堆栈的返回(这句话我也没懂什么意思,将来回头再问)


2.书上的实现chmod为什么mode最后化成8进制。

/*************************************************************************
> File Name: my_chmod.c
> Author:zhuziyu
> Mail:
> Created Time: 2016年07月18日 星期一 08时58分12秒
************************************************************************/

#include<stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include<sys/stat.h>
int main(int argc,char ** argv)
{
int mode;
int u_mode;
int ug_mode;
int o_mode;
char *filename;
if(argc<3)
{
printf("使用方法 : %s <mode> <filename>",argv[0]);
exit(0);
}
mode=atoi(argv[1]);
if(mode>777||mode<0)
{
printf("mode 范围 : 0~777");
exit(0);
}
u_mode=mode/100;
ug_mode=mode/10-u_mode*10;
o_mode=mode%10;
mode=(u_mode*64)+ug_mode*8+o_mode;<<<<<<<<<<<<<<<<<<<<<<就是这一步为啥要转换
filename=argv[2];
if(chmod(filename,mode)==-1)
{
printf("修改失败\n\n");
exit(1);
}
return 0;

}

因为假设设定的文件权限是123,是以字符形式输入的,atoi函数把它转换成了10进制的,但是你想表达的123是8进制的,所以它真正转变为10进制的数并不是123,而是83,也就是说,你需要分离出来1,2,3然后算出来真正的mode十进制下的值,这才是mode真正的值,之前的atoi("123")这一步出来的mode的值不是真正的mode的值。


3.S_IRWXU这是usr权限下的可读可写可执行的混合写。。。


4.my_read出现的问题:(先写代码)

#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
void my_error(char * err_string)
{
    perror(err_string);
    exit(1);
}
int my_read(int f)
{
    int  i=0;
    int  retu=0;
    int  len=0;
    char read_buffer[64];
    if(lseek(f,0,SEEK_END)==-1)
    {
        my_error("SEEK_END");
    }
    if((len=lseek(f,0,SEEK_CUR))==-1)
    {
        my_error("SEEK_CUR");
    }
    if(lseek(f,0,SEEK_SET)==-1)
    {
        my_error("SEEK_SET");
    }
   // printf("%d\n",len);
    if((retu=read(f,read_buffer,len))<0)
    {
        my_error("read");
    }
    for(i=0;i<len;i++)
    {
        printf("%c",read_buffer[i]);
    }
    printf("\n");
    return retu;
}
int main()
{
    int f;
    char buffer[32]="My name is zhuziyu";
    //if((f=creat("new.txt",S_IRWXU))==-1)
    if((f=open("new.txt",O_RDWR|O_CREAT|O_TRUNC,S_IRWXU))==-1)
        {
            my_error("open");
        }
    else
    printf("creat is successful!\n");
    if(write(f,buffer,strlen(buffer))!=strlen(buffer))
    {
        my_error("write");
    }
    printf("\t\t\t\t读出的内容如下\n\n");
    printf("---------------------------------------\n\n\n");
    my_read(f);
    printf("---------------------------------------\n\n");


    return 0;
}

如果加上红字那一句,就会出现bad file discription的字样,段描述符错误。因为用creat创建的文件,只能以只写的方式打开,因此读不进去,用gdb调试的时候,也是证明,出错在了没有my_read函数标红字的read(f,read_buffer,len)那一句。


5.共享锁互斥锁初次描述:


1->多个进程同时在一个字节上可以又一把共享的读锁。

2->在一个给定字节上的写锁只能由一个进程单独使用。

感觉写锁是有礼貌的老大的样子,他来了,谁都不能再来。如果他前面有人,那么他也不会来。因此是有礼貌的。


6.建议性锁和强制性锁初次描述(用的别人的话):


  • 建议性锁是这样规定的:每个使用上锁文件的进程都要检查是否有锁存在,当然还得尊重已有的锁。内核和系统总体上都坚持不使用建议性锁,它们依靠程序员遵守这个规定。(Linux默认是采用建议性锁)

  • 强制性锁是由内核执行的。当文件被上锁来进行写入操作时,在锁定该文件的进程释放该锁之前,内核会阻止任何对该文件的读或写访问,每次读或写访问都得检查锁是否存在。



7.系统调用和命令有差别:
 命令是根据系统调用写出来的。
这是我的mv:
/*************************************************************************
> File Name: my_mv.c
> Author:zhuziyu 
> Mail: 
> Created Time: 2016年07月19日 星期二 09时52分09秒
 ************************************************************************/


#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
    if(argc<3)
    {
        printf("书写规范 : %s <oneplace/+path> <otherplace/+path>",argv[0]);
        exit(1);
    }
    if(rename(argv[1],argv[2])<0)
    {
        perror("rename : ");
        exit(1);
    }
    return 0;
}
这是用系统调用写的,感觉命令是系统调用封起来使用的,像我写的这个就和命令mv不一样,我的这个argv[2]必须要以文件结尾,而不能是单纯的路径,否则会报错,像命令mv如果第三个参数不给文件,只有单纯地路径,那么可能会“默认”文件名称是mv。。总之,系统调用和命令不一样。我觉得我的代码也可以通过处理,实现第三个参数只给路径的功能。。不过,我没写,sorry,(这个sorry是给我自己说的,难过)。



1 0