1:使用 dup2 实现错误日志功能
使用 write 和 read 实现文件的拷贝功能,注意,代码中所有函数后面,紧跟perror输出错误 信息,要求这些错误信息重定向到错误日志 err.txt 中去
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
void copy_file(const char *src,const char *dst)
{
int src_fd = open(src,O_RDONLY);
if(src_fd==-1)
{
perror("打开源文件出错");
return;
}
int det_fd = open(dst,O_WRONLY | O_CREAT | O_TRUNC,0666);
if(det_fd==-1)
{
perror("打开目标文件出错");
close(src_fd);
return;
}
char buffer[4096];
ssize_t bytes_read;
while((bytes_read = read(src_fd,buffer,sizeof(buffer))) > 0)
{
if(write(det_fd,buffer,bytes_read)!=bytes_read)
{
perror("写入目标文件出错");
break;
}
}
if(bytes_read==-1)
{
perror("读取源文件错误");
}
close(src_fd);
close(det_fd);
}
int main(int argc, const char *argv[])
{
int err_fd = open("err.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
if(err_fd==-1)
{
perror("打开错误日志文件时出错");
return 1;
}
if(dup2(err_fd,STDERR_FILENO==-1))
{
perror("将标准错误重定向到错误日志文件出错");
close(err_fd);
return 1;
}
close(err_fd);
copy_file("508a.txt","508b.txt");
printf("文件拷贝完成\n");
return 0;
}
2:判断一个文件是否拥有用户可写权限,如果拥有,则去除用户可写权限,如果不拥有,则加上用户可写权限
权限更改函数:就是chmod函数,去man一下
要求每一次权限更改成功之后,立刻在终端显示当前文件的权限信息 :使用 ls -l显示(使用 system函数配合shell指令 ls -l 来实现)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
void change_permission(const char *file_path)
{
struct stat file_stat;
if(stat(file_path,&file_stat)==-1)
{
perror("stat");
exit(EXIT_FAILURE);
}
mode_t new_mode = file_stat.st_mode;
if(file_stat.st_mode & S_IWUSR)
{
new_mode &= ~S_IWUSR;
}
else
{
new_mode |= S_IWUSR;
}
if(chmod(file_path,new_mode)==-1)
{
perror("chmod");
exit(EXIT_FAILURE);
}
system("ls -l 508c.txt");
}
int main(int argc, const char *argv[])
{
const char *file_path = "508c.txt";
change_permission(file_path);
return 0;
}