作业-day-240508

思维导图

使用 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;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>