#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>
/* 使用dup2 实现错误日志功能
使用 write 和 read 实现文件的拷贝功能,注意,代码中所有函数后面
紧跟perror输出错误信息,要求这些错误信息重定向到错误日志 err.txt 中去 */
int main(int argc, const char *argv[])
{
//使用dup2实现错误日志功能
//创建并打开 err.txt文件
int fd=open("./err.txt",O_WRONLY|O_CREAT|O_TRUNC);
if(fd==-1)
{
perror("open");
return 1;
}
int std_err= dup(2);//保存原本的标准错误流到std_err
int fd_open=dup2(fd,2);//将标准错误流冲定向到fd
if(fd==-1)
{
perror("dup2");
}
//使用read和write两个函数,将文件homework.c拷贝给文件work.c
int rfd=open(argv[1],O_RDONLY);//被拷贝的源文件只允许读,不允许写入;
if(rfd==-1)
{
perror("rfd");
return 1;
}
int wfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);//拷贝的目标字符串如果不存在则创建
// 如果存在则清空文件内容后打开
if(wfd==-1)
{
perror("wfd");
return 1;
}
while(1)
{
char buf[2]={0};
int retval=read(rfd,buf,2);
if(retval==0)
{break;}
write(wfd,buf,2);
}
close(rfd);
close(wfd);
return 0;
}
int main(int argc, const char *argv[])
{
fp=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,0666);
//判断一个文件是否拥有用户可写权限
struct stat buf={0};
stat(argv[1],&buf);//获取argv[1]文件的属性并保存到buf里面去
mode_t mode =buf.st_mode;
//判断依据为:如果一个变量里面,某个bit是1的话,(按位或)|该bit位
//1的话,该变量是不变的
if((mode|S_IWUSR)==mode);
{
printf("%s该文件拥有用户可写权限\n");
chmod(argv[1],mode|S_IWUSR);
system("ls-l stdeer.txt|",|lolcat);
}
else
{
chmod(argv[1],mode|S_IWUSR);
system("ls-l stderr.txt|",lolcat);
}
close(fp);
return 0;
}