版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1、利用文件系统调用函数实现cp命令,例如./a.out a.txt b.txt当前目录下的a.txt至U b.txt#include <string.h>#include <strings.h>#include <stdio.h>#include <stdlib.h>#define BUFFER_SIZE 1024 int main(int argc,char *argv) FILE *from_fd;FILE *to_fd;long file_len=0;char bufferBUFFER_SIZE; char *ptr;/*判断人参*/if
2、(argc!=3) printf("Usage:%s fromfile tofilen",argv0); exit(1);/*打开源文件*/if(from_fd=fopen(argv1,"rb")=NULL)printf("Open %s Errorn",argv1); exit(1);/*创建目的文件 */if(to_fd=fopen(argv2,"wb")=NULL)printf("Open %s Errorn",argv2); exit(1);/*测得文件大小*/fseek(from_fd
3、,0L,SEEK_END);file_len=ftell(from_fd);fseek(from_fd,0L,SEEK_SET); printf("from file size is=%dn",file_len);/*进行文彳拷贝*/ while(!feof(from_fd)fread(buffer,BUFFER_SIZE,1,from_fd);if(BUFFER_SIZE>=file_len)fwrite(buffer,file_len,1,to_fd);elsefwrite(buffer,BUFFER_SIZE,1,to_fd); file_len=file_le
4、n-BUFFER_SIZE;/写入完成后清空缓冲区memset(buffer,0,BUFFER_SIZE);fclose(from_fd);fclose(to_fd);exit(0); 2、通过leek函数,计算文件大小。#include<sys/type.h>#include<unistd.h>off_t Iseek (int fd,off_t pos,int origin);fd文件描述符originSEEK_CUR pos为0,返回当前文件位置(相对文件当前读写指针的位置+pos)SEEK_END:若pos为0,设为文件尾部(相对当前文件长度+pos)SEEK_S
5、ET若pos为0,设文件开始(将文件设置成 pos)Pos文件偏移量返回值:成功返回新文件位置,失败返回-1运行时,要输入要计算文件的名字,和一个复制用的文件名(可不存在的)#include <stdio.h> /printf fprintf#include <string.h> /memset#include <unistd.h> /read write lseek#include <stdlib.h> /exit#include <errno.h> /errno 全局变量#include <fcntl.h> /open
6、#define LEN 1024void mycp(int fd_in,int fd_out)char buffLEN = 0;int size;int len;/如果读取成功,将缓冲区数据写入out文件while(size =read(fd_in,buff,sizeof(buff) > 0)写入数据,如果失败,程序退出if(write(fd_out,buff,size) != size)fprintf(stderr,"write error: %sn", strerror(errno);exit(1);打印偏移量len=lseek(fd_in,0,SEEK_CUR)
7、;printf("读了 %dn",len);/写入完成后清空缓冲区memset(buff,0,sizeof(buff);if(size < 0)fprintf(stderr,"read error: %sn", strerror(errno);exit(1);return;int main(int argc,char *argv)判断参数是否输入正确(是否输入了两个文件名)if(argc<3)fprintf(stderr,"输入参数出错: %sn",strerror(errno);exit(1);/打开文件,判断打开是否失
8、败(打开需计算的文件)int fd_in=open( argv1,O_RDONLY);if(fd_in<0)fprintf(stderr,"打开文件出错:%sn",strerror(errno);exit(1);int fd_out=open( argv2,O_WRONLY|O_CREAT|O_TRUNC,0644);(存放文件) if(fd out<0)fprintf(stderr,"写入文件出错:%sn",strerror(errno); exit(1);/拷贝文件数据mycp(fd_in,fd_out);close(fd_in); cl
9、ose(fd_out);return 0; 3、实现cat命令查看文件内容,例如 ./a.out a.txt可以打印a.txt内容#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>void main
10、(int argc,char *argv)int fd;char buffer125;if(fd=open(argv1,O_RDONLY)<0)fprintf(stderr,"error:%san",strerror(errno);exit(0);printf("show file:n");while(1)memset(buffer,0,sizeof(buffer);if(read(fd,buffer,125)<0)fprintf(stderr,"error:%san",strerror(errno);exit(0);if
11、(buffer99=0)break;printf("%s",buffer);close(fd); 4、编程实现两个进程同时对同一个文件每隔一秒钟写入一个字节的数据,对文件上锁以实 现数据安全。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>/上阻塞写锁#define S_WRLKW(fd,start,whence,len) lock
12、_reg(fd,F_SETLKW,F_WRLCK,start,whence,len)F_SETLKW(wait 阻塞)F_WRLCK(独占性写锁)解锁#define UN_LOCK(fd,start,whence,len) lock_reg(fd,F_SETLK,F_UNLCK,start,whence,len)/F_SETLK (非阻塞) F_UNLCK (解锁一个区域)void sys_error(const char *name,int err)fprintf(stderr,"%s: %sn",name,strerror(err);exit(1);/文件锁操作int
13、lock_reg(int fd,int flag,short type,off_t start,short whence,off_t len)/准备文件锁结构体struct flock l;memset(&l,0,sizeof(l);填入锁信息l.l_type = type;/type 锁类型l.l_start = start;/start 偏移量 offsetl.l_whence = whence;/whence 相对位置 SEEK_SET SEEK_CUR SEEK_ENDl.l_len = len; /len锁长度 0表示从指定位置到文件尾部/ 上锁:fcntlif(fcntl(
14、fd,flag,&l) < 0)return 0;return 1;pid1:./a.out a.txt 12345pid2:./a.out a.txt abcedint main(int argc,char *argv口)if(argc < 3)fprintf(stderr,"usage: %s file stringsn",argv0); exit(1);int fd = open(argv1,O_CREAT|O_WRONLY0664);if(fd < 0)sys_error("open",errno);int len =
15、strlen(argv2);int i = 0;/对文件上锁(写,阻塞)int r = S_WRLKW(fd,0L,SEEK_SET,0);if(r = 0)fprintf(stderr,"s_wr lock errorn");elseprintf("s_wr lock success!n");每间隔1s写入一个数据lseek(fd,0L,SEEK_END);for(;i < len;i+)if(write(fd,&argv2i,1) != 1) sys_error("write",errno);printf("
16、;pid(%d) write success!n", getpid();获取当前进程idsleep(1);printf("all file data write successn");解锁UN_LOCK(fd,0L,SEEK_SET,0);close(fd);return 0;5、编程实现,利用存储映射函数将一文件映射的用户空间,然后读取信息并打印出来。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include
17、<fcntl.h>#include <unistd.h>#include <sys/mman.h>#include <unistd.h>void copy(int fd_in,int fd_out);/添加、去除文件状态标志int set_fl(int fd,int flag);int clr_fl(int fd,int flag);void sys_error(const char *name,int err)fprintf(stderr,"%s: %sn", name,strerror(err);exit(1);/ ./a
18、.out a.txtint main(int argc,char *argv)if(argc < 2)fprintf(stderr,"usage: %s filen", argv0);exit(1);打开文件一定要和映射时读写方式对应/注意:打开文件必须要有读权限int fd = open(argv1,O_RDWR);if(fd < 0)sys_error("open",errno);int len = lseek(fd,0L,SEEK_END);/开始建立映射映射区可读、可写共享模式char *p = (char *)mmap(0,len,
19、PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if(p = MAP_FAILED)/(void *)(-1) sys_error("mmap",errno);/通过映射区查看文件内容 printf("p: %s'n",p);/断开映射munmap(p,len);close(fd);return 0;6、利用库函数进行文件读写操作,新建一个学生信息结构体student,数据成员有名字,年龄,性别等,利用库函数把信息保存在文件stu.dat中,然后再读取出来#include <stdio.h>/printf(
20、)#include <string.h>#include <stdlib.h>/exit()#include <errno.h>strerror() int main()struct studentchar *name;char *age;char *sex;stu;char Name10="LiMein"char Age5="18n"char Sex3="wn"=Name;stu.age=Age;stu.sex=Sex;FILE *fd;fd= fopen("stu.da
21、t","w");int p1,p2,p3;fputs(,fd);fputs(stu.age,fd);fputs(stu.sex,fd);if(p1=EOF)|(p2=EOF)|(p3=EOF)fprintf(stderr,"write error:%sn",strerror(errno);exit(0);fclose(fd);fd=fopen("stu.dat","r");char buffer20;fgets(buffer,sizeof(),fd);printf(&quo
22、t;name:%s",buffer);fgets(buffer,sizeof(stu.age),fd);printf("age:%s",buffer);fgets(buffer,sizeof(stu.sex),fd);printf("sex:%s",buffer);fclose(fd);1、编程实现,打印输出文件属性信息。#include <stdio.h>#include <string.h>#include <stdlib.h>#include <errno.h>#include <fc
23、ntl.h>#include <sys/stat.h>#include <time.h>#include <unistd.h>void sys_error(const char *name,int err) fprintf(stderr,"%s: %sn", name,strerror(err);exit(1);/ ./a.out a.txtint main(int argc,char *argv口)if(argc < 2)fprintf(stderr,"usage: %s filen", argv0);e
24、xit(1);/准备文件属性结构体变量struct stat st;memset(&st,0,sizeof(st);/如果要获取符号链接文件信息必须Istatif(lstat(argv1,&st) < 0)sys_error("stat",errno);/输出文件属性信息printf("Name: %sn",argv1);/文件的权限、大小、I节点编号、时间printf("mode: %dn",st.st_mode);printf("size: %ldn",st.st_size);printf
25、("ino: %ld'n",st.st_ino);printf("uid: %dn",st.st_uid);printf("nlink: %ld'n",st.st_nlink);/1970.1.1 00:00:00 -> 现在 秒数printf("atime: %sn",ctime(&st.st_atime);printf("mtime: %sn",ctime(&st.st_mtime);printf("ctime: %sn",ctime
26、(&st.st_ctime);return 0; 2、编程实现类似ls -R的功能,递归显示目录及其子目录里面的内容。#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <dirent.h>#include <sys/stat.h>void List(const char *name)int i;打开目录DIR *d = opendir(name);struct dirent *dir = NULL;
27、循环读取目录里面内容if( d= opendir(name) != NULL)while(NULL != (dir = readdir(d) if(dir->d_type = 8)/ d_type : 8-文件,4-目录printf("%sn", dir->d_name);else if(dir ->d_name0 != '.') / 子目录不空 printf("%s/n", dir->d_name); for(i=0;i<=strlen(dir->d_name);i+) printf("&q
28、uot;);List(dir->d_name);/递归遍历子目录/printf("返回%snn", dir->d_name); closedir(d); else printf("Open %s/ failed.n",name);int main() List("/home/jvcvcc"); return 0;1、编程实现:利用fork()函数,启动子进程,然后父子进程都打印出自己进程的ID。#include <stdio.h>#include <unistd.h>#include <err
29、no.h>#include <stdlib.h>int main(int argc, char *argv) pid_t child;/*创建子进程*/ child=fork(); if(child=-1)/ 出错 printf("error!");exit(1);else if(child>0)/父进程返回子进程号printf("I am the parent:%dn",getppid(); exit(1);else if(child=0)/ 子进程中printf("I am the child:%dn",g
30、etpid();/exit(1);return 0;1、编程实现:利用管道进行父子进程通信,父进程发送消息“hello”,子进程打印消息。#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <string.h>#include <stdlib.h>int main()int pipe_fd2;/管道返回读写文件描述符pid_t pid;char buf_r100;char* p_wbuf;int r_nu
31、m;memset(buf_r,0,sizeof(buf_r);/ 将 buf_r 初始化 char str1= "hello"r_num=10;/*创建管道*/if(pipe(pipe_fd)<0)printf("pipe create errorn");return -1;/*创建子进程*/if(pid=fork()=0)子进程执行代码close(pipe_fd1);/1、子进程先关闭了管道的写端2、让父进程先运行,这样父进程先写子进程才有内容读3、读取管道的读端,并输出数据if(read(pipe_fd0,buf_r, r_num)<0)
32、printf("read1 error!");exit(-1);printf("child read (parent writel) %s!n",buf_r);close(pipe_fd0); 4、关闭管道的读端,并退出exit(1);else if(pid>0) /父进程执行代码close(pipe_fd0);/1、父进程先关闭了管道的读端p_wbuf=str1;/ 2、向管道写入字符串数据write(pipe_fd1,p_wbuf,sizeof(str1);close(pipe_fd1); 3、关闭写端,并等待子进程结束后退出 exit(1);
33、return 0;2、编程实现:进程启动后每隔1秒打印一个数字,然后捕获SIGINT和SIGTSTP言号,分别打印对应的捕获信息。#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>/1、自定义信号处理函数,处理SIGBUS言号,打印捕捉到信号即可static void signal_handler(int signo)if(signo =SIGINT)printf("nI have get SIGINT'n");if(s
34、igno = SIGTSTP)printf("nI have get SIGTSTP'n");exit(EXIT_FAILURE);int main() int k=0;pid_t child;child =fork();if(child=0)for(int i=0; i<100000;i+)if(i=0)printf("Waiting for signal. n ");printf("%d,",i);usleep(10000);exit(0);2、注册信号处理函数if(child>0)if(signal(SIGI
35、NT,signal_handler)=SIG_ERR)fprintf(stderr,"cannot handle SIGINT'n"); exit(EXIT_FAILURE);if(signal(SIGTSTPSignal_handler)=SIG_ERR) fprintf(stderr,"cannot handle SIGSTP'n"); exit(EXIT_FAILURE);pause();将进程挂起直到捕捉到信号为止exit(0);return 0;3、编程实现两个程序:一个程序创建一个消息队列,然后放入两个类型的消息,另一个程序接
36、收该消息队列,取出类型为2的消息实体并打印出来。#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <sys/msg.h> / 消息队列void sys_error(const char *name,int err)fprintf(stderr,"%s: %sn", name,strerror(err);exit(1);typedef structlon
37、g mtype; /消息类型int num1;/ 消息值int num2;Msg;/往消息队列里面发送消息int main()/获取key值第二个参数随意key_t key = ftok("/etc/passwd",1);/创建或打开消息队列int msgid = msgget(key,IPC_CREAT|0644);if(msgid < 0)sys_error("msgget",errno);/往消息队列里面写 消息Msg s1 = 1,1,100;Msg s3 = 3,2,300;Msg s4 = 3,3,400;Msg s5 = 4,4,50
38、0;Msg s2 = 2,1,200;if(msgsnd(msgid,(void *)&s1,sizeof(s1),IPC_NOWAIT) < 0) sys_error("msgsnd",errno);if(msgsnd(msgid,(void *)&s2,sizeof(s2),IPC_NOWAIT) < 0) sys_error("msgsnd",errno);if(msgsnd(msgid,(void *)&s3,sizeof(s3),IPC_NOWAIT) < 0) sys_error("msgs
39、nd",errno);if(msgsnd(msgid,(void *)&s4,sizeof(s4),IPC_NOWAIT) < 0) sys_error("msgsnd",errno);if(msgsnd(msgid,(void *)&s5,sizeof(s5),IPC_NOWAIT) < 0) sys_error("msgsnd",errno);return 0;#include <stdio.h>#include <stdlib.h>#include <errno.h>#inc
40、lude <string.h>#include <unistd.h>#include <sys/msg.h> / 消息队列void sys_error(const char *name,int err)fprintf(stderr,"%s: %sn", name,strerror(err);exit(1);typedef structlong mtype; /消息类型int num1;/ 消息值int num2;Msg;/往消息队列里面发送消息/ ./a.out 0|1|-3|5int main(int argc,char *argv)i
41、f(argc < 2)fprintf(stderr,"usage: %s num!n",argv0);exit(1);/获取key值第二个参数随意key_t key = ftok("/etc/passwd",1);/创建或打开消息队列int msgid = msgget(key,0644);if(msgid < 0)sys_error("msgget",errno);/获取消息信息Msg s;int type = atoi(argv1);/ 据 type 寻找数据类型if(msgrcv(msgid,(void *)&
42、;s,sizeof(s), type,IPC_NOWAIT) < 0)sys_error("msgrev",errno);输出取到的消息printf("s.type: %ld,s.num1: %d,s.num2: %dn",s.mtype,s.num1,s.num2);/获取消息队列属性信息/*struct msqid_ds attr;if(msgctl(msgid,IPC_STAT,&attr) < 0)fprintf(stderr,"msgctl: %sn", strerror(errno);exit(1);p
43、rintf("num: %ld,bytes: %ld'n", attr.msg_qnum, attr.msg_qbytes);*/return 0;1、编程实现一个TCP服务器程序,当有客户端连接时,打印信息提示有客户端连接上。#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>#include <sys/types.h>#include <netinet/i
44、n.h>#include <sys/socket.h>#include<arpa/inet.h>/inet_ntoa()#include <unistd.h>/read(),close()#define portnumber 3333int main(int argc, char *argv)int sockfd,new fd;struct sockaddr_in server_addr;struct sockaddr_in client_addr;int sin_size;int nbytes;int n;char buffer1024;if(soc
45、kfd=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"socket error:%sn",strerror(errno); exit(1);bzero(&server_addr,sizeof(struct sockaddr_in);server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=htonl(INADDR_ANY);server_addr.sin_addr.s_addr=inet_addr(""); server_addr.sin_port=htons(portnumber);if(bind(sockfd,(struct sockaddr *)(&server_addr),
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年掌控中考复习配套课件:第九单元溶液
- 《老人与海》课件
- 2024年阿坝职业学院单招职业适应性测试题库及答案解析
- 单位管理制度集合大全【人力资源管理篇】
- 单位管理制度分享合集【人员管理】十篇
- 单位管理制度范文大合集【员工管理】十篇
- 单位管理制度呈现大全【人事管理篇】十篇
- 《诗五首》教案设计
- 第7单元 工业革命和国际共产主义运动的兴起(高频选择题50题)(解析版)
- UFIDAU培训课程委托代销
- 电力电子技术(广东工业大学)智慧树知到期末考试答案章节答案2024年广东工业大学
- 2024年中国移动甘肃公司招聘笔试参考题库含答案解析
- 反面典型案例剖析材料范文(通用6篇)
- 增强热塑性塑料复合管在我国的发展现状
- 机械设计外文文献翻译、中英文翻译、外文翻译
- 美标渐开线花键计算程序2014.8
- 英格索兰空压机操作规程
- 风动送样手册
- 绩效考核评分标准
- 电力建设施工技术管理
- NB∕T 32004-2018 光伏并网逆变器技术规范
评论
0/150
提交评论