哲学家问题LINUX实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/5/5
IPC通信机制简介
UNIX System V中提供了一系列新的进 程通信机构,即IPC机构。其出现大大加强 了UNIX的进程间通信功能。它包括三种: 消息传送、信号量和共享存储器。
2020/5/5
IPC信号量机制中的有关系统调用
1、 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
ushort *array;
2020/5/5
struct seminfo *__buf;
semctl
④cmd:命令名。常用的有以下几个: • GETVAL:返回第semnum个信号量的值。 • SETVAL:设置第semnum个信号量的值,值放在arg.val • GETALL:读信号量集中所有信号量的值(放在arg.array) • SETALL:设置信号量集中所有信号量的值(放在arg.array) • IPC_RMID:删除由semid确定的信号量集合。
int semget (key_t key, int nsems, int semflg) 功能:创建一个信号量集合,分配相应数据结构 并返回与之对应的信号量标识符,出错时返回 -1 。
2020/5/5
semget参数说明
① key:信号集的键 ② nsems:创建的信号量集合中包含的信号量个数 ③ semflg:信号存取权标志与建立标志。其中其低9
位为表示信号的存取权限(拥有者,同一使用群及其 它用户) ,这与文件系统的类似。建立标志则有两个 ,分别IPC_CREAT和IPC_EXCL
IPC_CREAT:若该信号不存在,semget将建立它。 IPC_EXCL:只有在信号集不存在的情况下,新的信号才会建立。否则 semget()将返回-1,并设置错误码。
2020/5/5
semget
如何确定key: 使用函数key_t ftok (char *path , char id)。
它返回由path和id所确定的IPC键值,当两者中 任一不同时将返回不同的键值。若path提供的文 件名不存在则返回 -1。
2020/5/5
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int main() {
int semid, numsems=5; if((semid=semget(IPC_PRIVATE,numsems,IPC_CREAT|0660)) ==-1) {
return(-1); } return(semid); }
2020/5/5
IPC信号量机制中的有关系统 调用
2、int semctl (int semid, int semnum, int cmd, union
2020/5/5
相关系统调用
2、当父进程通过fork创建了子进程之后, 父进程和子进程的 执行顺序是无法控制的。如果想控制, 可以让父进程调用等 待函数wait。 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); 函数返回: 若成功则为进程ID,若当前无子进程则返回 -1 。 参数说明: status: 如果是不是空指针, 则子进程的返回状态保存在该 20指20/5针/5 指向的整型变量中; 如果是空指针, 则忽略返回状态.
printf("error ocurred!\n"); else if(pc==0){ /* 如果是子进程 */
printf("This is child process with pid of %d\n",getpid()); sleep(3); /* 睡眠10秒钟 */ } else{ /* 如果是父进程 */ pr=wait(NULL); /* 在这里等待 */ printf("I catched a child process with pid of %d\n"),pr); } exit(0); }
2020/5/5
semget
创建信号量集合过程的简单描述: if (key == IPC_PRIVATE) 在系统中创建一个新的信号量集合, 返回其semid; else if ((semflg&IPC_CREAT) && (!(semflg&IPC_EXCL)))
if (与key相关的信号量集合存在) 直接返回其semid; else在系统中创建一个新的信号量集合,返回其semid; else if ((semflg&IPC_CREAT) && (semflg&IPC_EXCL)) if (与key相关的信号量集合存在) 返回 -1; else在系统中创建一个新的信号量集合,返回其semid; else 不创建信号量,返回 -1.
2020/5/5
相关系统调用
1、fork () 功能:创建子进程。 入口参数:无。 出口参数:正确时,对父进程返回值 为子进程的pid (正整数),对子进程返 回0。错误时,返回值为 -1。
2020/5/5
fork ()
注意:在子进程刚被创建时,它和其父 进程具有相同的共享正文段,而其他进 程信息(数据段,栈等)则完全拷贝父 进程而得到。
相Hale Waihona Puke Baidu系统调用
3、 exit (int status) 终止现运行进程,将status传递给父进程。
2020/5/5
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> main() { pid_t pc,pr; pc=fork(); if(pc<0) /* 如果出错 */
semun arg) 功能:按cmd指出的命令对和semid对应的信号量集进行控 制,失败时返回 -1。 参数说明:
①semid:合法信号量集合的标识。
②semnum:信号量集合中的所要控制的信号量编号(从0开 始)。 ③arg:命令参数。union semun含有以下几个域:
int val;
struct semid_ds *buf;
IPC通信机制简介
UNIX System V中提供了一系列新的进 程通信机构,即IPC机构。其出现大大加强 了UNIX的进程间通信功能。它包括三种: 消息传送、信号量和共享存储器。
2020/5/5
IPC信号量机制中的有关系统调用
1、 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h>
ushort *array;
2020/5/5
struct seminfo *__buf;
semctl
④cmd:命令名。常用的有以下几个: • GETVAL:返回第semnum个信号量的值。 • SETVAL:设置第semnum个信号量的值,值放在arg.val • GETALL:读信号量集中所有信号量的值(放在arg.array) • SETALL:设置信号量集中所有信号量的值(放在arg.array) • IPC_RMID:删除由semid确定的信号量集合。
int semget (key_t key, int nsems, int semflg) 功能:创建一个信号量集合,分配相应数据结构 并返回与之对应的信号量标识符,出错时返回 -1 。
2020/5/5
semget参数说明
① key:信号集的键 ② nsems:创建的信号量集合中包含的信号量个数 ③ semflg:信号存取权标志与建立标志。其中其低9
位为表示信号的存取权限(拥有者,同一使用群及其 它用户) ,这与文件系统的类似。建立标志则有两个 ,分别IPC_CREAT和IPC_EXCL
IPC_CREAT:若该信号不存在,semget将建立它。 IPC_EXCL:只有在信号集不存在的情况下,新的信号才会建立。否则 semget()将返回-1,并设置错误码。
2020/5/5
semget
如何确定key: 使用函数key_t ftok (char *path , char id)。
它返回由path和id所确定的IPC键值,当两者中 任一不同时将返回不同的键值。若path提供的文 件名不存在则返回 -1。
2020/5/5
#include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int main() {
int semid, numsems=5; if((semid=semget(IPC_PRIVATE,numsems,IPC_CREAT|0660)) ==-1) {
return(-1); } return(semid); }
2020/5/5
IPC信号量机制中的有关系统 调用
2、int semctl (int semid, int semnum, int cmd, union
2020/5/5
相关系统调用
2、当父进程通过fork创建了子进程之后, 父进程和子进程的 执行顺序是无法控制的。如果想控制, 可以让父进程调用等 待函数wait。 #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *status); 函数返回: 若成功则为进程ID,若当前无子进程则返回 -1 。 参数说明: status: 如果是不是空指针, 则子进程的返回状态保存在该 20指20/5针/5 指向的整型变量中; 如果是空指针, 则忽略返回状态.
printf("error ocurred!\n"); else if(pc==0){ /* 如果是子进程 */
printf("This is child process with pid of %d\n",getpid()); sleep(3); /* 睡眠10秒钟 */ } else{ /* 如果是父进程 */ pr=wait(NULL); /* 在这里等待 */ printf("I catched a child process with pid of %d\n"),pr); } exit(0); }
2020/5/5
semget
创建信号量集合过程的简单描述: if (key == IPC_PRIVATE) 在系统中创建一个新的信号量集合, 返回其semid; else if ((semflg&IPC_CREAT) && (!(semflg&IPC_EXCL)))
if (与key相关的信号量集合存在) 直接返回其semid; else在系统中创建一个新的信号量集合,返回其semid; else if ((semflg&IPC_CREAT) && (semflg&IPC_EXCL)) if (与key相关的信号量集合存在) 返回 -1; else在系统中创建一个新的信号量集合,返回其semid; else 不创建信号量,返回 -1.
2020/5/5
相关系统调用
1、fork () 功能:创建子进程。 入口参数:无。 出口参数:正确时,对父进程返回值 为子进程的pid (正整数),对子进程返 回0。错误时,返回值为 -1。
2020/5/5
fork ()
注意:在子进程刚被创建时,它和其父 进程具有相同的共享正文段,而其他进 程信息(数据段,栈等)则完全拷贝父 进程而得到。
相Hale Waihona Puke Baidu系统调用
3、 exit (int status) 终止现运行进程,将status传递给父进程。
2020/5/5
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdlib.h> main() { pid_t pc,pr; pc=fork(); if(pc<0) /* 如果出错 */
semun arg) 功能:按cmd指出的命令对和semid对应的信号量集进行控 制,失败时返回 -1。 参数说明:
①semid:合法信号量集合的标识。
②semnum:信号量集合中的所要控制的信号量编号(从0开 始)。 ③arg:命令参数。union semun含有以下几个域:
int val;
struct semid_ds *buf;