- 设计一个程序,要求打开文件“pass”,如果没有这个文件,新建此文件,权限设置为只有所有者有已读权限
//打开函数
open(const char* pathname,int flags), int open(const char *pathname, int flags, mode_t mode);
pathname:要打开的文件名(含路径,缺省为当前路径)
flags: O_RDONLY 只读打开 O_WRONLY 只写打开 O_RDWR 可读可写打开
可以选择加上O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。
文件描述符fd=0是标准输入 fd=1是标准输出 fd=2是标准错误
#include<stdio.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
int fd;//定义一个文件描述符
if(fd=open("./pass",O_CREAT|S_IRUSR,0400)<0)
{
printf("打开文件失败,需要重新创建");
}
else
{
close(fd);
}
system("ls ./pass -l");
return 0;
}
- 设计一个程序,要求新建一个文件“hello”,利用write函数将“Linux下c软件设计”字符串写入该函数
strlen()函数读取字符串长度
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int fd;
char *str="Linux下c软件设计";
fd=creat("./hello",S_IWUSR|S_IRUSR);
if(fd<0)
{
printf("创建失败");
}
else{
write(fd,str,strlen(str));
}
system("cat ./hello");
return 0;
}
~
3.设计一个程序,要求利用read函数读取系统文件“/etc/passwd”,并在终端显示输出
STDOUT_FILENO可以用文件描述符 标准输出1表示
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd;
//打开文件
fd=open("/etc/passwd",O_RDONLY);
char *buf;
int n;
//读取文件
while((n=read(fd,buf,80))>0)
{
//写文件 STDOUT_FILENO可以用文件描述符 标准输出1表示
write(STDOUT_FILENO,buf,n);
}
close(fd);
return 0;
}
- 设计一个程序,要求打开文件pass,如果没有这个文件,新建此文件,在读取系统文件“/etc/passswd”,把文件中的内容都写入“pass”文件中
//打开源文件,写入目标文件
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd;
fd=open("./pass",O_CREAT|O_WRONLY,0600);
if(fd<0)
{
printf("打开文件错误,需要重新创建");
}
int source;
source=open("/etc/passwd",O_RDONLY|O_WRONLY);
int n;
char *buf;
while((n=read(source,buf,80))>0)
{
write(fd,buf,n);
}
return 0;
}
- 设计一个程序,要求为“bin/ls/”文件建立一个软链接“ls1”和一个硬链接“ls2”,并查看两个链接文件和“/bin/ls“文件。
#include<stdio.h>
#include<unistd.h>
int main()
{
symlink("bin/ls","ls1");
//硬链接创建时源文件必须存在,不许给目录创建应链接
link("bin/ls","ls2");
system("ls ls1 -l");
system("ls ls2 -l");
system("ls /bin/ls -l");
return 0;
}
- 编程实现ls的基本功能,并实现-l参数功能;如:
- 若没指定目录则显示当前目录的所有可见文件;
- 若指定目录,参数指定问文件显示该文件信息,若为目录则显示该目录中的的文件信 息;
- -l参数格式同ls -l;
- 指定目录可以是多个;
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<time.h>
#include<pwd.h>
#include<grp.h>
void filebuf(mode_t mode,char *rs){ //判断文件类型以及所有者,组和其他的权限;
if(S_ISDIR(mode)){
rs[0]='d';
}
else if(S_ISREG(mode)){
rs[0]='-';
}
else if(S_ISFIFO(mode)){
rs[0]='p';
}
else if(S_ISLNK(mode)){
rs[0]='l';
}
else if(S_ISBLK(mode)){
rs[0]='b';
}
else if(S_ISSOCK(mode)){
rs[0]='s';
}
else if(S_ISCHR(mode)){
rs[0]='c';
}
if(mode & S_IRUSR) rs[1]='r';
else rs[1]='-';
if(mode & S_IWUSR) rs[2]='w';
else rs[2]='-';
if(mode & S_IXUSR) rs[3]='x';
else rs[3]='-';
if(mode & S_IRGRP) rs[4]='r';
else rs[4]='-';
if(mode & S_IWGRP) rs[5]='w';
else rs[5]='-';
if(mode & S_IXGRP) rs[6]='x';
else rs[6]='-';
if(mode & S_IROTH) rs[7]='r';
else rs[7]='-';
if(mode & S_IWOTH) rs[8]='w';
else rs[8]='-';
if(mode & S_IXOTH) rs[9]='x';
else rs[9]='-';
rs[10]='\0';
}
int main(int argc, char *argv[]) {
struct stat fst;
struct tm *mytime=(struct tm *)malloc(sizeof(struct tm));
char rs[12];
if(argc!=2){
fprintf(stderr,"Usage: %s <pathname>\n",argv[0]);
exit(EXIT_FAILURE);
}
if(stat(argv[1],&fst)==-1)
{
perror("stat");
exit(EXIT_FAILURE);
}
filebuf(fst.st_mode,rs);
printf("%s",rs); //输出文件类型与权限信息;
printf(" %d",fst.st_nlink);//输出文件的硬链接数;
printf(" %s",getpwuid(fst.st_uid)->pw_name);//输出所属用户名;
printf(" %s",getgrgid(fst.st_gid)->gr_name);//输出用户所在组;
printf(" %1d",fst.st_size);//输出文件大小;
mytime=localtime(&fst.st_mtime);//获取文件修改时间;
printf("%d-%02d-%02d%02d:%02d",mytime->tm_year+1900,mytime->
tm_mon+1,mytime->tm_mday,mytime->tm_hour,mytime->tm_min);
printf(" %s",argv[1]);//输出文件名;
printf("\n");
return 0;
}