练习1:
1:使用 dup2 实现错误日志功能 使用 write 和 read 实现文件的拷贝功能,注意,代码中所有函数后面,紧跟perror输出错误信息,要求这些错误信息重定向到错误日志 err.txt 中去
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 #include <unistd.h> 6 #include <sys/stat.h> 7 #include <fcntl.h> 8 #include <pthread.h> 9 #include <semaphore.h> 10 #include <wait.h> 11 #include <signal.h> 12 #include <sys/socket.h> 13 #include <arpa/inet.h> 14 #include <sys/socket.h> 15 #include <sys/ipc.h> 16 #include <sys/sem.h> 17 #include <semaphore.h> 18 #include <sys/msg.h> 19 #include <sys/shm.h> 20 #include <sys/un.h> 21 int main(int argc, const char *argv[]) 22 { 23 int errfd=open("./err.txt",O_WRONLY|O_CREAT|O_TRUNC,0666); 24 if(errfd==-1) 25 { 26 perror("no open err.txt"); 27 return -1; 28 } 29 if(dup2(errfd,2)==-1) 30 { 31 perror("dup2 error"); 32 close(errfd); 33 return -1; 34 } 35 close(errfd); 36 int rfd=open(argv[1],O_RDONLY); 37 if(rfd==-1) 38 { 39 perror("no open argv[1]"); 40 return -1; 41 } 42 int wfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666); 43 if(wfd==-1) 44 { 45 perror("no open argv[2]"); 46 return -1; 47 } 48 char str[100]={0}; 49 int a=0; 50 while((a=read(rfd,str,100))) 51 { 52 if(a==-1) 53 { 54 perror("read error"); 55 break; 56 } 57 if(write(wfd,str,a)==-1) 58 { 59 perror("write error"); 60 break; 61 } 62 } 63 if(close(rfd)==-1) 64 { 65 perror("close rfd error"); 66 return -1; 67 } 68 if(close(wfd)==-1) 69 { 70 perror("close wfd error"); 71 return -1; 72 } 73 return 0; 74 } ~
练习2:
2:判断一个文件是否拥有用户可写权限,如果拥有,则去除用户可写权限,如果不拥有,则加上用户可写权限权限更改函数:就是chmod函数,自己去man一下要求每一次权限更改成功之后,立刻在终端显示当前文件的权限信息 :使用 ls -l显示(使用 system函数配合shell指令 ls -l 来实现)
5 #include <unistd.h> 6 #include <sys/stat.h> 7 #include <fcntl.h> 8 #include <pthread.h> 9 #include <semaphore.h> 10 #include <wait.h> 11 #include <signal.h> 12 #include <sys/socket.h> 13 #include <arpa/inet.h> 14 #include <sys/socket.h> 15 #include <sys/ipc.h> 16 #include <sys/sem.h> 17 #include <semaphore.h> 18 #include <sys/msg.h> 19 #include <sys/shm.h> 20 #include <sys/un.h> 21 int main(int argc, const char *argv[]) 22 { 23 int file_exist=access(argv[1],F_OK); 24 if(file_exist==EOF) 25 { 26 perror("file no exist"); 27 return -1; 28 } 29 struct stat buf={0}; 30 if(stat(argv[1],&buf)==EOF) 31 { 32 perror("stat error"); 33 return -1; 34 } 35 mode_t mode=buf.st_mode; 36 if((mode|S_IWUSR)==mode) 37 { 38 if(chmod(argv[1],(mode &~S_IWUSR))==EOF) 39 { 40 perror("chmod error"); 41 return -1; 42 } 43 } 44 else 45 { 46 if(chmod(argv[1],(mode|S_IWUSR))==EOF) 47 { 48 perror("chmod error"); 49 return -1; 50 } 51 } 52 char str[200]={0}; 53 snprintf(str,200,"ls -l %s",argv[1]); 54 system(str); 55 return 0; 56 } ~ ~ ~
思维导图: