Linux进程间通信:信号量P、V操作详解

需积分: 16 8 下载量 74 浏览量 更新于2024-08-25 收藏 473KB PPT 举报
"进程间通信是操作系统中多进程协同工作的重要机制,而在Linux中,P、V操作是实现这一机制的关键。P操作(Wait)和V操作(Signal)源于荷兰计算机科学家Edsger Dijkstra提出的信号量机制,用于解决进程间的同步和互斥问题。这段代码展示了如何在Linux中使用P、V操作进行进程间的通信。 在描述的代码段中,首先定义了两个结构体P和V,它们分别对应P操作和V操作。P操作用于减小信号量,而V操作则是增加信号量。在P操作中,`sem_num=0`表示操作的是信号量数组的第一个元素,`sem_op=-1`意味着要减一,`sem_flg=SEM_UNDO`表明如果进程异常退出,系统会撤销信号量的改变。相反,V操作将信号量加一。 接下来的代码通过`fork()`创建子进程,然后父进程进入一个循环,每次循环都会调用`semop()`执行P、V操作。`semop()`是Linux中进行信号量操作的系统调用,它接收一个信号量集的标识符(mutexid)和一个操作数组,这里的操作数组包含P和V操作。在进入临界区前,父进程执行P操作,这使得其他试图进入临界区的进程会被阻塞,直到父进程完成其工作并执行V操作释放资源。之后,父进程打印出“prnt in”和“prnt out”,模拟了在临界区内的工作,然后再次执行V操作,允许其他进程进入临界区。这个过程重复三次后,父进程等待所有子进程结束,然后使用`semctl()`撤销信号量集,最后退出。 在标签中提到的“Linux进程”和“进程通信”是关键概念。在Linux中,进程是系统中运行的程序实例,而进程间通信(IPC)是让这些进程能够交换数据、协调工作的手段。信号量是IPC的一种形式,特别适用于解决多进程之间的同步问题。 在Linux中,信号量的管理涉及到几个系统调用,如`semget()`、`semop()`和`semctl()`。`semget()`用于创建新的信号量集或获取已存在的信号量集,它需要一个key值来唯一标识信号量集。`semop()`执行具体的信号量操作,如P和V操作。`semctl()`则可以对信号量集进行控制,如设置值、获取信息或删除信号量集。 这段代码演示了在Linux环境下如何使用P、V操作和信号量来实现进程间的同步,同时介绍了Linux中与信号量相关的系统调用。这种机制对于理解和实现多进程环境下的并发控制至关重要。

邻接矩阵存储图的深度优先遍历 分数 20 作者 DS课程组 单位 浙江大学 试实现邻接矩阵存储图的深度优先遍历。 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */ 函数DFS应从第V个顶点出发递归地深度优先遍历图Graph,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按序号递增的顺序。题目保证V是图中的合法顶点。 裁判测试程序样例: #include <stdio.h> typedef enum {false, true} bool; #define MaxVertexNum 10 /* 最大顶点数设为10 */ #define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/ typedef int Vertex; /* 用顶点下标表示顶点,为整型 */ typedef int WeightType; /* 边的权值设为整型 */ typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; typedef PtrToGNode MGraph; /* 以邻接矩阵存储的图类型 */ bool Visited[MaxVertexNum]; /* 顶点的访问标记 */ MGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */ void Visit( Vertex V ) { printf(" %d", V); } void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); int main() { MGraph G; Vertex V; G = CreateGraph(); scanf("%d", &V); printf("DFS from %d:", V); DFS(G, V, Visit); return 0; } /* 你的代码将被嵌在这里 */ 输入样例:给定图如下 5 输出样例: DFS from 5: 5 1 3 0 2 4 6

2023-05-24 上传