return 0; } int main() {
semctl(semid, 0, SETVAL, 1); semctl(semid, 1, SETVAL, NUM); semctl(semid, 2, SETVAL, 0); }
pid = fork(); if (pid == 0) } int i;
for (i = 0; i < 2; ++i)
{
pthread_join(p1,NULL); pthread_join(p2,NULL); {
ret=pthread_create(&p2,NULL,(void *)consumer,NULL);
int pid,ret; pthread_t p1,p2;
pid = fork(); if (pid == 0) {
int semid = semget(SEMKEY, 3, IPC_CREAT|0666);
int shmid = shmget(SHMKEY, sizeof(ShareBuf), IPC_CREAT|0777); char *shmaddr = shmat(shmid, NULL, 0); ShareBufInit((ShareBuf *)shmaddr);
ret=pthread_create(&p1,NULL,(void *)producer,NULL);
wait(NULL); }
semctl(semid, 0, IPC_RMID, 0); semctl(semid, 1, IPC_RMID, 0); semctl(semid, 2, IPC_RMID, 0);
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, 0); return 0; }
4 实验四目录查询
4.1 实验目的
1)了解并掌握Linux线程及信号灯;
2)了解Linux线程与信号灯使用,包括:Linux线程,Linux信号灯,线程互斥,
线程同步。
4.2 实验要求
1)熟悉Linux文件系统的使用; 2)了解Linux文件系统目录结构;
3)编程实现目录查询命令,包括:功能类似ls –lR,查询指定目录下的文件及子
目录信息,显示文件的类型、大小、时间等信息,递归显示子目录中的文件信息。
4.3 设计思想
目录查询实验要求功能类似ls –lR,可以查询指定目录下的文件及子目录信息,显示文件的类型、大小、时间等信息,递归显示子目录中的文件信息。
首先用opendir打开指定目录,readdir读取目录的下一个目录项,再用lstat查询文件信息。利用队列方式显示目录,并忽略“.”、“、”、“..”与隐藏文件。
程序结构如下所是:
argv[1]或当前目录入目录队列; while (目录队列未空) {
取队首目录dirpath;
打开目录dirpath; 改变当前目录dirpath; while (dirent=dirpath中目录项) { }
关闭目录dirpath;
} 4.4 实验结果
运行结果如图5、图6所示:
取dirent的信息; if (dirent为目录文件) dirpath+ dirent入目录队列; else
显示dirent的长格式信息;
图5 运行结果
图6 运行结果
4.5 程序源代码 #include
#include
#define TRUE 1 #define FALSE 0
typedef int BOOL;
typedef struct {
typedef struct Node {
typedef struct {
BOOL InitQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode)); if (Q->front == NULL) {
QueuePtr front; QueuePtr rear; ElemType data; struct Node *next; char name[NAME_MAX+1]; } ElemType;
} QNode, *QueuePtr;
} LinkQueue;