思维导图
使用 dup2 实现错误日志功能
使用 write 和 read 实现文件的拷贝功能,注意,代码中所有函数后面,紧跟perror输出错误信息,要求这些错误信息重定向到错误日志 err.txt 中去
代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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>
int main(int argc, const char *argv[])
{
//使用dup2实现错误日志功能
//使用write和read实现文件的拷贝功能
//所有函数后面紧跟perror输出错误信息,重定向到错误日志err.txt文件中齐
int tf=dup(2); //保存标准错误流
//创建并打开err.txt文件
int wef=open("./err.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);
perror("wef"); //输出错误流信息
dup2(wef,2); //将标准输出流重定向到wf
perror("dup2"); //输出错误流信息
char buf[30]; //读取用的缓存文件
//只读模式打开要复制的文件
int rf=open(argv[1],O_RDONLY);
perror("rf"); //输出错误流信息
if(rf==-1)
return 1;
//创建复制文件并以可写模式打开
int wcf=open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0666);
perror("wcf"); //输出错误流信息
while(1)
{
int retval=read(rf,buf,30);
perror("read"); //输出错误流信息
if(retval==0)
break;
write(wcf,buf,retval);
perror("write"); //输出错误流信息
}
dup2(tf,2); //重置标准错误流
perror("rdup2");
close(wef);
close(rf);
close(wcf);
perror("close");
return 0;
}
运行结果:(标准错误重定向后,仅第一个输出内容正确)
err.txt文件内容:
判断一个文件是否拥有用户可写权限,如果拥有,则去除用户可写权限,如果不拥有,则加上用户可写权
代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.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>
int main(int argc, const char *argv[])
{
//使用stat函数获取文件权限信息
//判断一个文件是否拥有用户可写权限,
//如果有,则去除用户可写权限。如果没有,则加上用户可写权限
struct stat buf;
stat(argv[1],&buf);
mode_t mode=buf.st_mode;
//通过按位或进行判断,若是一样的话,值是不变的
if((mode | S_IWUSR)==mode)
{
printf("%s文件有用户可写权限\n",argv[1]);
int retval=chmod(argv[1],mode &~ S_IWUSR);
if(retval==-1)
{
perror("chmod-");
return 1;
}
else
{
printf("用户写权限去除成功\n");
system("ls -l");
}
}else
{
printf("%s文件无用户可写权限\n",argv[1]);
int retval=chmod(argv[1],mode | S_IWUSR);
if(retval==-1)
{
perror("chmod+");
return 1;
}
else
{
printf("用户写权限添加成功\n");
system("ls -l");
}
}
return 0;
}