环境:Ubuntu20.04
编译软件:VScode
编译:GCC
调试:GDB
ar rcs libxxx.a xxx.o xxx.o
gcc -c -fpic/-fPIC a.c b.c
gcc -shared a.o b.o -o libcalc.so
函数
gcc -g -Wall xxxx.c -o xxxx
注:-g是在可执行文件中加入源代码的信息,并不是把整个源文件嵌入到可执行文件中
以下部分开始讨论UNIX系统,
#include
#include
#include
#include
#include
int main()
{
int fd =open("a.txt",O_RDONLY);
if(fd == -1)
{
perror("open");
}
close(fd);
return 0;
}
#include
#include
#include
#include
#include
int main()
{
//1.通过open打开english.txt文件
int srcfd = open("english.txt",O_RDONLY);
if(srcfd == -1)
{
perror("open");
return -1;
}
//2.创建一个新的文件
int destfd = open("copy.txt",O_WRONLY | O_CREAT,0664);
if(destfd == -1)
{
perror("open");
return -1;
}
//3.频繁的读写操作
char buf[1024]={0};
int len =0;
while((len = read(srcfd,buf,sizeof(buf))) >0 )
{
write(destfd, buf, len);
}
//4.关闭文件
close(srcfd);
close(destfd);
}
#include
#include
#include
#include
#include
int main()
{
int fd = open("hello.txt",O_RDWR);
if(fd == -1)
{
perror("open");
return -1;
}
//扩展文件的长度
int ret =lseek(fd, 100 ,SEEK_END);
if(ret == -1)
{
perror("lseek");
return -1;
}
//写入一个空数据
write(fd, " ", 1);
//关闭文件
close(fd);
}
返回值
若成功,返回0;
出错,返回-1
参数1:要操作的文件名路径
参数2:结构体变量,包括文件的相关信息
mode_t:文件的类型和存取的权限
st_size:文件字节数
等
举例(获取该文件的大小)
#include
#include
#include
#include
#include
int main()
{
struct stat statbuf;
int ret = stat("a.txt", &statbuf);
if(ret == -1)
{
perror("stat");
return -1;
}
printf("size: %ld\n", statbuf.st_size);
return 0;
}
//模拟实现ls -l的指令
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char * argv[])
{
//判断输入的参数是否正确
if(argc < 2)
{
printf("%s filename\n",argv[0]);
return -1;
}
//通过stat函数获取用户传入的文件信息
struct stat st;
int ret = stat(argv[1], &st);
if(ret == -1)
{
perror("stat");
return -1;
}
//获取文件类型和文件权限
char perms[11]={0};
switch (st.st_mode & S_IFMT) //与掩码进行或运算
{
case S_IFSOCK:
perms[0]='s';
break;
case S_IFLNK:
perms[0]='l';
break;
case S_IFREG:
perms[0]='-';
break;
case S_IFBLK:
perms[0]='b';
break;
case S_IFDIR:
perms[0]='d';
break;
case S_IFCHR:
perms[0]='c';
break;
case S_IFIFO:
perms[0]='p';
break;
default:
perms[0]='?';
break;
}
//判断文件的访问权限
//文件所有者
perms[1] = (st.st_mode & S_IRUSR)?'r':'-';
perms[2] = (st.st_mode & S_IWUSR)?'w':'-';
perms[3] = (st.st_mode & S_IXUSR)?'x':'-';
//文件所在组
perms[4] = (st.st_mode & S_IRGRP)?'r':'-';
perms[5] = (st.st_mode & S_IWGRP)?'w':'-';
perms[6] = (st.st_mode & S_IXGRP)?'x':'-';
//其他人
perms[7] = (st.st_mode & S_IROTH)?'r':'-';
perms[8] = (st.st_mode & S_IWOTH)?'w':'-';
perms[9] = (st.st_mode & S_IXOTH)?'x':'-';
//获取硬连接数
int linuNum = st.st_nlink;
//文件所有者
char * fileUser =getpwuid(st.st_uid)->pw_name;
//文件所在组
char * fileGrp = getgrgid(st.st_gid)->gr_name;
//文件大小
long int fileSize = st.st_size;
//获取修改时间
char * time =ctime(&st.st_mtime);
char mtime[512]={0};
strncpy(mtime,time,strlen(time)-1);
char buf[1024];
sprintf(buf, "%s %d %s %s %ld %s %s",perms,linuNum,fileUser,fileGrp ,fileSize,mtime,argv[1]);
printf("%s\n",buf);
return 0;
}
#include
#include
#include
#include
#include
int main()
{
//1、获取当前的工作目录
char buf[128];
getcwd(buf,sizeof(buf));
printf("当前的工作目录为:%s\n",buf);
//2、修改工作目录
int ret = chdir("/home/metrorise/linux/lesson1-26");
if(ret == -1)
{
perror("chdir");
return -1;
}
//3、创建新的文件
int fd = open("chdir.txt",O_CREAT | O_RDWR,0664);
if(fd == -1)
{
perror("open");
return -1;
}
//4、修改后的工作目录
char buf1[128];
getcwd(buf1,sizeof(buf));
printf("当前的工作目录为:%s\n",buf1);
//5、关闭
close(fd);
}
#include
#include
#include
#include
#include
int getFileNum(const char * path);//函数的声明
// 读取某个目录下所有的普通文件的个数
int main(int argc, char * argv[])
{
if(argc < 2) {
printf("%s path\n", argv[0]); //输入格式:./xx 目标目录
return -1;
}
int num = getFileNum(argv[1]);
printf("普通文件的个数为:%d\n", num);
return 0;
}
// 用于获取目录下所有普通文件的个数
int getFileNum(const char * path) {
// 1.打开目录
DIR * dir = opendir(path);
if(dir == NULL) {
perror("opendir");
exit(0);
}
struct dirent *ptr;
// 记录普通文件的个数
int total = 0;
//循环读目录文件
while((ptr = readdir(dir)) != NULL) {
// 获取名称——判断是. 还是..文件,将其忽略
char * dname = ptr->d_name;
// 忽略掉. 和.. strcmp比较字符串
if(strcmp(dname, ".") == 0 || strcmp(dname, "..") == 0) {
continue;
}
// 判断是否是普通文件还是目录
if(ptr->d_type == DT_DIR) {
// 目录,需要继续读取这个目录
char newpath[256];
sprintf(newpath, "%s/%s", path, dname);
total += getFileNum(newpath);
}
if(ptr->d_type == DT_REG) {
// 普通文件
total++;
}
}
// 关闭目录
closedir(dir);
return total;
}
#include
#include
#include
#include
#include
#include
int main() {
int fd = open("1.txt", O_RDWR | O_CREAT, 0664);
if(fd == -1) {
perror("open");
return -1;
}
int fd1 = open("2.txt", O_RDWR | O_CREAT, 0664);
if(fd1 == -1) {
perror("open");
return -1;
}
printf("fd : %d, fd1 : %d\n", fd, fd1);
int fd2 = dup2(fd, fd1);
if(fd2 == -1) {
perror("dup2");
return -1;
}
// 通过fd1去写数据,实际操作的是1.txt,而不是2.txt
char * str = "hello, dup2";
int len = write(fd1, str, strlen(str));
if(len == -1) {
perror("write");
return -1;
}
printf("fd : %d, fd1 : %d, fd2 : %d\n", fd, fd1, fd2);
close(fd);
close(fd1);
return 0;
}
#include
#include
#include
#include
int main() {
// 1.复制文件描述符
// int fd = open("1.txt", O_RDONLY);
// int ret = fcntl(fd, F_DUPFD);
// 2.修改或者获取文件状态flag
int fd = open("1.txt", O_RDWR);
if(fd == -1) {
perror("open");
return -1;
}
// 获取文件描述符状态flag
int flag = fcntl(fd, F_GETFL);
if(flag == -1) {
perror("fcntl");
return -1;
}
flag |= O_APPEND; // flag = flag | O_APPEND
// 修改文件描述符状态的flag,给flag加入O_APPEND这个标记
int ret = fcntl(fd, F_SETFL, flag);
if(ret == -1) {
perror("fcntl");
return -1;
}
char * str = "nihao";
write(fd, str, strlen(str));
close(fd);
return 0;
}