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默认是采用建议性锁)
-
强制性锁是由内核执行的。当文件被上锁来进行写入操作时,在锁定该文件的进程释放该锁之前,内核会阻止任何对该文件的读或写访问,每次读或写访问都得检查锁是否存在。
> 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;