图2
使用./main打开程序
2.3 实验总结
通过此次实验了解了进程的创建,知道了进程与线程的区别。编写的程序输出固定的几个字符,功能上没做好,欠佳,有待优化。
2.4 源代码
头文件m.h #include
第 9 页
sem.sem_num = index;/*信号灯数组灯的一个索引,指明哪个信号灯*/ sem.sem_op = 1;/*加到当前信号灯的数值*/ sem.sem_flg = 0; semop(semid,&sem,1); return; } void P(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; semop(semid,&sem,1); return; } Main.c #include\ int main(void) { int res,i; struct shmid_ds *buf; int cmd; int shmid1,shmid2; char *s,*t; pid_t p1,p2,p3; semid = semget(IPCKEY,4,IPC_CREAT|0666); res = semctl(semid,0,SETVAL,0); res = semctl(semid,1,SETVAL,1); res = semctl(semid,2,SETVAL,0); res = semctl(semid,3,SETVAL,1); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); printf(\ s=(char *)shmat(shmid1,NULL,NULL); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); if((p1=fork()) == 0){ execv(\ } else 1
第 10 页
{ if((p2=fork()) == 0){ execv(\ } else { if((p3=fork())==0){ execv(\ } } } p1=wait(&p1); p2=wait(&p2); p3=wait(&p3); if(semctl(semid,0,IPC_RMID,0)<0) printf(\ shmctl(shmid1,IPC_RMID,0); shmctl(shmid2,IPC_RMID,0); return 0; } Get.c #include\int main(void) { int i=0; int shmid1; char *s,*t,str[]=\ semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,NULL); do { P(semid,1); *s=str[i]; printf(\ i++; V(semid,0); }while(s[0]!='\\0'); } Copy.c #include\int main(void) { 1
第 11 页
int j=0; int shmid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid1 = shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666); s=(char *)shmat(shmid1,NULL,NULL); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); do { P(semid,0); P(semid,3); strcpy(t,s); printf(\ V(semid,2); V(semid,1); }while(t[0]!='\\0'); } Put.c #include\int main(void) { int k=0; int shmid1,shmid2; char *s,*t; semid = semget(IPCKEY,4,IPC_CREAT|0666); shmid2 = shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666); t=(char *)shmat(shmid2,NULL,NULL); do { /*if(t[0]=='\\0')break;*/ P(semid,2); if(t[0]!='\\0')printf(\ else printf(\ V(semid,3); }while(t[0]!='\\0'); }
1
第 12 页
实验三 Linux文件目录操作
3.1 实验目的与内容
3.1.1 实验目的
了解并掌握Linux文件目录结构
3.1.2 实验内容
编程实现目录查询命令; 功能类似ls -lR;
查询指定目录下的文件及子目录信息; 显示文件的类型、大小、时间等信息; 递归显示子目录中的文件信息;
3.2 实验过程
3.2.1 预备知识
Linux文件属性接口:
表3. 1 文件属性接口
函数 int fstat(int fildes,struct stat *buf); 功能 返回文件描述符相关的文件的状态信息 int lstat(const char *path, struct stat 如读取到了符号连接,读取符号连接本*buf); 身的状态信息 int stat(const char *path, struct stat *buf); 如读取到了符号连接,读取的是符号连接指向文件的信息 stat结构体几乎保存了所有的文件状态信息:
本程序中主要用到st_mode 文件的权限信息和类型信息,检查类型时使用S_ISDIR(); 宏,检查是否是目录
Linux目录结构接口:
表3. 2 目录结构接口
函数 功能 DIR *opendir(const char *name); 通过路径打开一个目录,返回一个DIR结构体 指针(目录流),失败返回NULL; struct dirent *readdir(DIR *) 1
读取目录中的下一个目录项,没有目录项可以第 13 页
相关推荐: