2.设计内容

把下面的几个网址的内容看懂,关于Linux的通信机制就会有个基本的了解了,后面的这几个代码也应该可以看得懂了。

2)实现一个管道通信程序。话不多说,直接贴代码。

#include <sys/sem.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <time.h>
#include <sys/wait.h>
#define BUFFER_SIZE 8192 int pipe_used_size(int pipe[2],sem_t *pipe_mutex){
int status=0;
int count=0;
char buffer[1];
sem_wait(pipe_mutex);
while(status>=0){
status=read(pipe[0], buffer,1);
if(status>=0){count=count+1;}
}
for(int i=0;i<count;i++){
write(pipe[1],buffer,1);
}
sem_post(pipe_mutex);
printf("pipe has %dB used\n",count);
return count;
} int pipe_left_size(int pipe[2],sem_t *pipe_mutex){
int status=0;
int count=0;
char buffer[1];
sem_wait(pipe_mutex);
while(status>=0){
status=write(pipe[1],buffer,1);
if(status>=0){count=count+1;}
}
for(int i=0;i<count;i++){
read(pipe[0], buffer,1);
}
sem_post(pipe_mutex);
printf("pipe has %dB left\n",count);
return count;
} int main(){
int pipe_fd[2];
int status;
char buffer[BUFFER_SIZE];//会初始化为0吗?
pid_t pid1,pid2,pid3;
sem_t *pipe_mutex;
pipe_mutex = sem_open("pipe_mutex", O_CREAT | O_RDWR, 0666, 0);
int pipe_size = 0;
status = pipe(pipe_fd);
if(status == -1){
printf("create pipe failed");
exit(-1);
} int flags = fcntl(pipe_fd[1], F_GETFL);
fcntl(pipe_fd[1], F_SETFL, flags | O_NONBLOCK);
flags = fcntl(pipe_fd[0], F_GETFL);
fcntl(pipe_fd[0], F_SETFL, flags | O_NONBLOCK);
//这一块是干什么的?就是为了实现非阻塞写,
//因为在无名管道中没有open(),但是可以通过这个中方式来设置实现非阻塞写 while(status>=0){
status = write(pipe_fd[1], buffer, 128);//怎么那个管道的最大是多大?为啥出来是653....,这个是查看默认的管道的空间大小是多少。
if(status>=1){
pipe_size += 128;
}
} printf("pipe size:%d\n", pipe_size);
//pipe_used_size(pipe_fd,pipe_mutex);
status=0; while(status>=0){
status = read(pipe_fd[0], buffer, 128);
} printf("EAGAIN %d\n", EAGAIN); /*flags = fcntl(pipe_fd[1], F_GETFL);
fcntl(pipe_fd[1], F_SETFL, flags ^ O_NONBLOCK);
flags = fcntl(pipe_fd[0], F_GETFL);
fcntl(pipe_fd[0], F_SETFL, flags ^ O_NONBLOCK);*/ status = 0;
if((pid1 = fork()) == 0){
while(status>=0){
sem_wait(pipe_mutex);
printf("child1 start writing\n");
status=write(pipe_fd[1], buffer, 128);
printf("child1 write %d\n", status);
//sleep(1);
sem_post(pipe_mutex);
}
exit(0);
}else if((pid2 = fork()) == 0){
while(status>=0){
sem_wait(pipe_mutex);
printf("child2 start writing\n");
status=write(pipe_fd[1], buffer, 2047);
printf("child2 write %d\n", status);
//sleep(1);
sem_post(pipe_mutex);
}
exit(0);
}else if((pid3 = fork()) == 0){
while(status>=0){
sem_wait(pipe_mutex);
printf("child3 start writing\n");
status=write(pipe_fd[1], buffer, 4200);
printf("child3 write %d\n", status);
//sleep(1);
sem_post(pipe_mutex);
}
exit(0);
}else{
getchar();//这个语句在这里的作用是什么?
sem_post(pipe_mutex);
wait(0);
wait(0);
wait(0);
pipe_left_size(pipe_fd,pipe_mutex);//这两个函数的作用又是什么?
sem_unlink("pipe_mutex");
} return 0;
}

3)利用Linux的消息队列通信机制实现线程的通信,也是直接上代码。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/sem.h>
#include<sys/shm.h>
#include <fcntl.h>
#define MSG_MAX 100 struct my_msgbuf{
long int mtype;
char mtext[MSG_MAX];
}; void *sender1(){
int n;
struct my_msgbuf message;
char buf[MSG_MAX];
sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
if( msqid == -1){
printf("create failed");
exit(-1);
} while(1){
sem_wait(mutex);
printf("sender1 wirte :");
scanf("%s", &buf);
printf("\n");
message.mtype = 1;
if(strcmp(buf,"exit") == 0){
strcpy(message.mtext,"end1");
n = msgsnd(msqid, (void *)&message, 100, 0);//还有关于这个接收消息的类型?
sem_wait(receive1_over);
n = msgrcv(msqid, (void *)&message, 100, 2, 0);
printf("%s\n", message.mtext); sem_post(sender1_over);
sem_post(mutex);
sleep(1);
return 0;
}
else{
strcpy(message.mtext,buf);
n = msgsnd(msqid, (void *)&message, 100, 0);
sem_post(mutex);
sleep(1);
} } } void *sender2(){
int n;
struct my_msgbuf message;
char buf[MSG_MAX];
sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0);
int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
if( msqid == -1){
printf("create failed");
exit(-1);
} while(1){
sem_wait(mutex);
printf("sender2 wirte :");
scanf("%s", &buf);
printf("\n");
message.mtype = 1;
if(strcmp(buf,"exit") == 0){
strcpy(message.mtext,"end2");
n = msgsnd(msqid, (void *)&message, 100, 0);
sem_wait(receive2_over);
n = msgrcv(msqid, (void *)&message, 100, 3, 0);
printf("%s\n", message.mtext);
sem_post(sender2_over);
sem_post(mutex);
sleep(1);
return 0;
}
else{
strcpy(message.mtext,buf);
n = msgsnd(msqid, (void *)&message, 100, 0);
sem_post(mutex);
sleep(1);
}
} } void *receive(){
int n;
int over1=0;
int over2=0;
struct my_msgbuf message;
char buf[MSG_MAX];
sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0644, 0);
sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0);
int msqid = msgget((key_t)8088, 0666 | IPC_CREAT); if( msqid == -1){
printf("create failed");
exit(-1);
} while(1){
n = msgrcv(msqid, (void *)&message, 100, 0, 0);
if(n > 0){
printf("\n receive %s\n", message.mtext);
if( strcmp(message.mtext,"end1") == 0 ){
message.mtype = 2;
strcpy(message.mtext,"over1");
n = msgsnd(msqid, (void *)&message, 100, 0);
if( n == 0 ){
sem_post(receive1_over); sem_wait(sender1_over); }
over1 = 1;
}else if( strcmp(message.mtext,"end2") == 0 ){
message.mtype = 3;
strcpy(message.mtext,"over2");
n = msgsnd(msqid, (void *)&message, 100, 0);
if( n == 0 ){
sem_post(receive2_over);
sem_wait(sender2_over);
}
over2 = 1;
} }
if(over1==1 && over2==1){
msgctl(msqid, IPC_RMID, 0);
exit(0);
}
sleep(1);
} } int main(){
int msqid = msgget((key_t)8088, 0666 | IPC_CREAT);
msgctl(msqid, IPC_RMID, 0);
sem_unlink("mutex");
sem_unlink("sender1_over");
sem_unlink("sender2_over");
sem_unlink("receive1_over");
sem_unlink("receive2_over"); sem_t *mutex = sem_open("mutex", O_CREAT | O_RDWR, 0666, 0);
sem_t *sender1_over = sem_open("sender1_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *receive1_over = sem_open("receive1_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *sender2_over = sem_open("sender2_over", O_CREAT | O_RDWR, 0666, 0);
sem_t *receive2_over = sem_open("receive2_over", O_CREAT | O_RDWR, 0666, 0); pthread_t pt1,pt2,pt3;
pthread_create(&pt1, NULL, sender1, NULL);
pthread_create(&pt2, NULL, sender2, NULL);
pthread_create(&pt3, NULL, receive, NULL);
sem_post(mutex);
pthread_join(pt1, NULL);
pthread_join(pt2, NULL);
pthread_join(pt3, NULL);
return 0;
}

4)利用Linux的共享内存通信机制实现两个进程间的通信。

//为消息接收程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include <fcntl.h> int main(){ char buf[50];
int shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666);
sem_t *mutex1 = sem_open("mutex1", O_CREAT | O_RDWR, 0666, 0);
sem_t *mutex2 = sem_open("mutex2", O_CREAT | O_RDWR, 0666, 0); sem_wait(mutex1); char *m =(char *)shmat(shmid, NULL, 0);
printf("receive: %s \n",m);
strcpy(buf, "over");
memcpy(m,buf,sizeof(buf)); shmdt(shmid);
sem_post(mutex2); return 0; }
//为消息发送程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include <fcntl.h> int main(){
char buf[50]; int shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666);
shmctl((key_t)8888, IPC_RMID, NULL);
sem_unlink("mutex1");
sem_unlink("mutex2"); sem_t *mutex1 = sem_open("mutex1", O_CREAT | O_RDWR, 0666, 0);
sem_t *mutex2 = sem_open("mutex2", O_CREAT | O_RDWR, 0666, 0);
shmid = shmget((key_t)8888, 50, IPC_CREAT | 0666); if( shmid == -1){
printf("create failed");
exit(-1);
} char *m = (char *)shmat(shmid, NULL, 0);
printf("sender writing:");
scanf("%s", buf);
memcpy(m,buf,sizeof(buf));
sem_post(mutex1);
sem_wait(mutex2); printf("\n%s\n/", m); shmdt(shmid);
shmctl((key_t)8888, IPC_RMID, NULL);
sem_unlink("mutex1");
sem_unlink("mutex2"); return 0;
}

实验三:Linux进程管理(HDU)的更多相关文章

  1. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  2. Linux内核分析——第三章 进程管理

    第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. ...

  3. Linux进程管理 (2)CFS调度器

    关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 ( ...

  4. Linux进程管理 (7)实时调度

    关键词:RT.preempt_count.RT patch. 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略.本章只是一个简单的介绍. 更详细的介绍参考<Linux进 ...

  5. Linux进程管理与调度-之-目录导航【转】

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  6. Linux性能及调优指南(翻译)之Linux进程管理

    本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.1节的翻译原文地址:http://www.redbooks.ibm.com/redpap ...

  7. Linux进程管理专题

    Linux进程管理 (1)进程的诞生介绍了如何表示进程?进程的生命周期.进程的创建等等? Linux支持多种调度器(deadline/realtime/cfs/idle),其中CFS调度器最常见.Li ...

  8. Linux进程管理 (1)进程的诞生

    专题:Linux进程管理专题 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 L ...

  9. Linux 进程管理 笔记

    https://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.htmlLinux 进程管理剖析 进程可以是短 ...

  10. 《Linux 性能及调优指南》1.1 Linux进程管理

    https://blog.csdn.net/ljianhui/article/details/46718835 本文为IBM RedBook的Linux Performanceand Tuning G ...

随机推荐

  1. 动态引用存储——集合&&精确的集合定义——泛型

    1,集合宏观理解 1.1,为什么引入集合? 对于面向对象的语言来说,操作对象的功能不可或缺. 为了方便对对象进行操作和处理,就必须要对对象进行暂时的存储.[数据最终存在数据库里] 使用数组来存储对象的 ...

  2. springboot 获取到的inputStream为空的问题

    springboot在接收http请求的时候读取的request的inputStream,造成我们想自己读取inputStream的时候发现inputStream已经无法读取了. 为了读取inputS ...

  3. 并行 Webclient(一)

    在 Stackoverflow 上看到了一个提问,关于并行的 WebClient,觉得回答者的代码很有参考性,下面记录一下,以便日后用到: 提问者: 我有一个功能基本上分为两个子功能. html=Re ...

  4. 美国 | USA B1/B2 十年签证到手记

    旅行生活美国 周一早上人还没到公司,就收到EMS快递员的电话,说有两份我的美国领事馆的签证快递,在前台要我签收一下. 美领馆的出签效率果然是高,上周三(8月10日)早上面签的,这三个工作日就把护照送到 ...

  5. excel中统计列中的值在其他列出现的次数多个条件

    excel中统计列中的值在其他列出现的次数多个条件 =COUNTIFS(E2:E373,"=VIP经销商",J2:J373,K2) 解释 E列的第二行到第373行中值 等于 VIP ...

  6. 1.Shell特殊位置变量

    $0    文件名及路径 $1,$2    参数1,参数2 , 也可以用${1}  和 ${2} 来表示 $#    传递给脚本或函数的参数个数 $$    当前Shell进程ID $?    判断上 ...

  7. 如何disabled禁用所有表单input输入框元素

    转载地址:https://www.zhangxinxu.com/wordpress/?p=8568 一.pointer-events:none和覆盖层方法的问题 经常会遇到需求,需要禁用div中或者f ...

  8. iOS7向开发者开放的新功能汇总

    转自:http://www.25pp.com/news/news_28002.html iOS7才放出第二个测试版本,我们已经看到了不少的新功能和新改变.最近,科技博客9to5Mac将iOS7中向开发 ...

  9. LabWindows/CVI第一章:基本规则

    一. #include<stdio.h>      //头文件,#号是预处理指令,standard input output header的缩写. void main()          ...

  10. nginx 的 重定向

    1. ngx.redirect(uri, status?)    301/302重定向 redirect  为外部重定向,有两种形式: rewrite ^ /foo? redirect;  # ngi ...