资源描述:
《湖北汽院嵌入式系统开发实验.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验二嵌入式Linux多线程通信实验程(thread)是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。P(S):①将信号量S的值减1,即S=S-1;②如果S≥0,则该进程继续执行;否则该进程状态置为阻塞状态,进程PCB排入信号量PCB队列末尾,放弃CPU,等待V操作的执行。V(S):1将信号量S的值加1,即S=S+1;2如果S≤0,释放信号量队列中第一个PCB所对应的进程,将进程状态由阻塞态改为就绪态。执行V操作的进程继续执行。#include#include#
2、include#include#defineMAXSIZE10intstack[MAXSIZE];intsize=50;intfront=-1,rear=0;sem_tavail,full;//avail表示可用的空缓冲区,full表示已存放产品的缓冲区//生产者pthread_tprovider,customer,end;voidprovider_fun(void)//full表示已存放产品的缓冲区{inti=1;sleep(5);while(i<=size)//生产50个产品,需要放
3、入到MAXSIZE个缓冲区中{sem_wait(&avail);//avail信号量P操作,表示将可用的空缓冲区个数减1stack[rear]=i;printf("producethe%dproduct",stack[rear]);rear=(rear+1)%MAXSIZE;i++;sleep(1);sem_post(&full);//full信号量V操作,表示将存放产品的缓冲区个数加1}pthread_exit(NULL);}//消费者voidcustomer_fun(void){inti=1;while(i<=size){se
4、m_wait(&full);//fulll信号量P操作,表示将存放产品的缓冲区个数减1front=(front+1)%MAXSIZE;printf("tconsumethe%dproduct",stack[front]);stack[front]=0;sleep(2);sem_post(&avail);//avail信号量V操作,表示将可用的空缓冲区个数加1i++;}pthread_exit(NULL);}voidend_fun(void){charch;scanf("%c",&ch);pthread_cancel(provid
5、er);pthread_cancel(customer);dpthread_exit(NULL);printf("exit!");}voidmain(){pthread_tprovider,customer;//定义生产者线程对象和消费者线程对象sem_init(&avail,0,MAXSIZE);//将avail信号量初始化为MAXSIZEsem_init(&full,0,0);//将full信号量初始化为0pthread_create(&provider,NULL,(void*)provider_fun,NULL);//创建生
6、产者线程pthread_create(&customer,NULL,(void*)customer_fun,NULL);//消费者线程pthread_create(&end,NULL,(void*)end_fun,NULL);pthread_join(provider,NULL);pthread_join(customer,NULL);pthread_join(end,NULL);sem_destroy(&avail);sem_destroy(&full);}实验三、嵌入式Linux网络通信实验3、TCP套接字通信步骤服务器端:(1)
7、调用socket()创建套接字,然后初始化structsockaddr_in结构体。(2)调用bind函数()为套接字绑定一个IP地址和一个端口号。(3)调用listen()函数使套接字成为监听套接字,侦听指定的端口。(4)调用accept()函数,使服务器处于阻塞状态,等待接受客户端连接请求。一旦建立连接,将产生新的套接字,此时就有两个套接字了,原来的那个套接字还在监听等待指定的端口,而新产生的套接字则准备发送或接受数据。(5)利用send/sendto和recv/recvfrom进行数据传输。当然也可以调用write或read.(
8、6)数据传输完毕,关闭套接字。请补充server.c中代码//fuwuqi#include#include//包含套接字函数库#include#in