




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1、利用文件系統(tǒng)調(diào)用函數(shù)實現(xiàn)cp命令,例如./a.out a.txt b.txt當(dāng)前目錄下的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);/*創(chuàng)建目的文件 */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);/*進(jìn)行文彳拷貝*/ 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;/寫入完成后清空緩沖區(qū)memset(buffer,0,BUFFER_SIZE);fclose(from_fd);fclose(to_fd);exit(0); 2、通過leek函數(shù),計算文件大小。#include<sys/type.h>#include<unistd.h>off_t Iseek (int fd,off_t pos,int origin);fd文件描述符originSEEK_CUR pos為0,返回當(dāng)前文件位置(相對文件當(dāng)前讀寫指針的位置+pos)SEEK_END:若pos為0,設(shè)為文件尾部(相對當(dāng)前文件長度+pos)SEEK_S
5、ET若pos為0,設(shè)文件開始(將文件設(shè)置成 pos)Pos文件偏移量返回值:成功返回新文件位置,失敗返回-1運(yùn)行時,要輸入要計算文件的名字,和一個復(fù)制用的文件名(可不存在的)#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;/如果讀取成功,將緩沖區(qū)數(shù)據(jù)寫入out文件while(size =read(fd_in,buff,sizeof(buff) > 0)寫入數(shù)據(jù),如果失敗,程序退出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);/寫入完成后清空緩沖區(qū)memset(buff,0,sizeof(buff);if(size < 0)fprintf(stderr,"read error: %sn", strerror(errno);exit(1);return;int main(int argc,char *argv)判斷參數(shù)是否輸入正確(是否輸入了兩個文件名)if(argc<3)fprintf(stderr,"輸入?yún)?shù)出錯: %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);/拷貝文件數(shù)據(jù)mycp(fd_in,fd_out);close(fd_in); cl
9、ose(fd_out);return 0; 3、實現(xiàn)cat命令查看文件內(nèi)容,例如 ./a.out a.txt可以打印a.txt內(nèi)容#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、編程實現(xiàn)兩個進(jìn)程同時對同一個文件每隔一秒鐘寫入一個字節(jié)的數(shù)據(jù),對文件上鎖以實 現(xiàn)數(shù)據(jù)安全。#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(獨(dú)占性寫鎖)解鎖#define UN_LOCK(fd,start,whence,len) lock_reg(fd,F_SETLK,F_UNLCK,start,whence,len)/F_SETLK (非阻塞) F_UNLCK (解鎖一個區(qū)域)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)/準(zhǔn)備文件鎖結(jié)構(gòu)體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寫入一個數(shù)據(jù)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();獲取當(dāng)前進(jìn)程idsleep(1);printf("all file data write successn");解鎖UN_LOCK(fd,0L,SEEK_SET,0);close(fd);return 0;5、編程實現(xiàn),利用存儲映射函數(shù)將一文件映射的用戶空間,然后讀取信息并打印出來。#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);/添加、去除文件狀態(tài)標(biāo)志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);打開文件一定要和映射時讀寫方式對應(yīng)/注意:打開文件必須要有讀權(quán)限int fd = open(argv1,O_RDWR);if(fd < 0)sys_error("open",errno);int len = lseek(fd,0L,SEEK_END);/開始建立映射映射區(qū)可讀、可寫共享模式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);/通過映射區(qū)查看文件內(nèi)容 printf("p: %s'n",p);/斷開映射munmap(p,len);close(fd);return 0;6、利用庫函數(shù)進(jìn)行文件讀寫操作,新建一個學(xué)生信息結(jié)構(gòu)體student,數(shù)據(jù)成員有名字,年齡,性別等,利用庫函數(shù)把信息保存在文件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、編程實現(xiàn),打印輸出文件屬性信息。#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);/準(zhǔn)備文件屬性結(jié)構(gòu)體變量struct stat st;memset(&st,0,sizeof(st);/如果要獲取符號鏈接文件信息必須Istatif(lstat(argv1,&st) < 0)sys_error("stat",errno);/輸出文件屬性信息printf("Name: %sn",argv1);/文件的權(quán)限、大小、I節(jié)點(diǎn)編號、時間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 -> 現(xiàn)在 秒數(shù)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、編程實現(xiàn)類似ls -R的功能,遞歸顯示目錄及其子目錄里面的內(nèi)容。#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、循環(huán)讀取目錄里面內(nèi)容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、編程實現(xiàn):利用fork()函數(shù),啟動子進(jìn)程,然后父子進(jìn)程都打印出自己進(jìn)程的ID。#include <stdio.h>#include <unistd.h>#include <err
29、no.h>#include <stdlib.h>int main(int argc, char *argv) pid_t child;/*創(chuàng)建子進(jìn)程*/ child=fork(); if(child=-1)/ 出錯 printf("error!");exit(1);else if(child>0)/父進(jìn)程返回子進(jìn)程號printf("I am the parent:%dn",getppid(); exit(1);else if(child=0)/ 子進(jìn)程中printf("I am the child:%dn",g
30、etpid();/exit(1);return 0;1、編程實現(xiàn):利用管道進(jìn)行父子進(jìn)程通信,父進(jìn)程發(fā)送消息“hello”,子進(jìn)程打印消息。#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;/*創(chuàng)建管道*/if(pipe(pipe_fd)<0)printf("pipe create errorn");return -1;/*創(chuàng)建子進(jìn)程*/if(pid=fork()=0)子進(jìn)程執(zhí)行代碼close(pipe_fd1);/1、子進(jìn)程先關(guān)閉了管道的寫端2、讓父進(jìn)程先運(yùn)行,這樣父進(jìn)程先寫子進(jìn)程才有內(nèi)容讀3、讀取管道的讀端,并輸出數(shù)據(jù)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、關(guān)閉管道的讀端,并退出exit(1);else if(pid>0) /父進(jìn)程執(zhí)行代碼close(pipe_fd0);/1、父進(jìn)程先關(guān)閉了管道的讀端p_wbuf=str1;/ 2、向管道寫入字符串?dāng)?shù)據(jù)write(pipe_fd1,p_wbuf,sizeof(str1);close(pipe_fd1); 3、關(guān)閉寫端,并等待子進(jìn)程結(jié)束后退出 exit(1);
33、return 0;2、編程實現(xiàn):進(jìn)程啟動后每隔1秒打印一個數(shù)字,然后捕獲SIGINT和SIGTSTP言號,分別打印對應(yīng)的捕獲信息。#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>/1、自定義信號處理函數(shù),處理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、注冊信號處理函數(shù)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();將進(jìn)程掛起直到捕捉到信號為止exit(0);return 0;3、編程實現(xiàn)兩個程序:一個程序創(chuàng)建一個消息隊列,然后放入兩個類型的消息,另一個程序接
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;/往消息隊列里面發(fā)送消息int main()/獲取key值第二個參數(shù)隨意key_t key = ftok("/etc/passwd",1);/創(chuàng)建或打開消息隊列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;/往消息隊列里面發(fā)送消息/ ./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值第二個參數(shù)隨意key_t key = ftok("/etc/passwd",1);/創(chuàng)建或打開消息隊列int msgid = msgget(key,0644);if(msgid < 0)sys_error("msgget",errno);/獲取消息信息Msg s;int type = atoi(argv1);/ 據(jù) type 尋找數(shù)據(jù)類型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、編程實現(xiàn)一個TCP服務(wù)器程序,當(dāng)有客戶端連接時,打印信息提示有客戶端連接上。#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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 股份保本協(xié)議書
- 花店入伙協(xié)議書
- 租賃終止協(xié)議書
- 玉器鑒定協(xié)議書
- 統(tǒng)一安裝協(xié)議書
- 土地入股合作社協(xié)議書
- 破除陰婚協(xié)議書
- 職工貸款協(xié)議書
- 資產(chǎn)調(diào)出協(xié)議書
- 藥店代銷協(xié)議書
- 食品安全自查、從業(yè)人員健康管理、進(jìn)貨查驗記錄、食品安全事故處置保證食品安全的規(guī)章制度
- 2025中考語文??甲魑难侯}(10大主題+10篇范文)
- 國家開放大學(xué)(財務(wù)報表分析)形考1-4
- 空白教案模板(表格形式-已排版)
- 工程經(jīng)濟(jì)學(xué)項目經(jīng)濟(jì)評價案例分析
- 最全深圳市工改工案例分析
- 在市財政系統(tǒng)警示教育暨作風(fēng)建設(shè)大會上的講話
- 《管理信息系統(tǒng)》課程設(shè)計報告范文
- GB∕T 37821-2019 廢塑料再生利用技術(shù)規(guī)范
- 測量學(xué)地形圖的基本知識培訓(xùn)講義PPT(講解)
- 自控實驗三線性定常系統(tǒng)的穩(wěn)態(tài)誤差
評論
0/150
提交評論