int main(int argc, char ** argv) { shm_network_init(); while(1) { /* Listen for requests and handle them */ switch(shm_cmd[0]) { case SHM_CMD_NEW_SERVER: { /* * get_packet_ptr is expected to return the start of the string * that must be passed in while communicating with this process. */ shm_t * new_server = shm_connect(SHM_DEV_SERVER, get_packet_ptr(shm_cmd), get_packet_ptr(shm_cmd)); if(SHM_IS_ERR(new_server)) { /* The server creation failed. Send error to whoever requested the server */ send_err(new_server); } else { /* The server is good */ send_confirmation(new_server, sizeof(shm_t)); } break; } case SHM_CMD_NEW_CLIENT: { shm_id_unique_t * clientname = (shm_id_unique_t *)get_packet_ptr(shm_cmd); shm_t * new_client = shm_connect(SHM_DEV_CLIENT, clientname->server_id, clientname->unique_id); if(SHM_IS_ERR(new_client)) { /* The client creation failed. Send error to whoever requested the client */ send_err(new_client); } else { /* The client is good */ send_confirmation(new_client, sizeof(shm_t)); } break; } case SHM_CMD_DESTROY_SERVER: shm_disconnect((shm_t*)get_packet_ptr(shm_cmd)); shm_ack(NULL, 0); break; case SHM_CMD_DESTROY_CLIENT: shm_disconnect((shm_t*)get_packet_ptr(shm_cmd)); shm_ack(NULL, 0); break; case SHM_CMD_SEND: /* Send packet directly from client/server to device (server or client): */ shm_send_to_device((shm_packet_t*)get_packet_ptr(shm_cmd)); break; case 0: /* No requests being done */ default: /* Clear out cmd flag */ shm_ack(NULL, 0); } thread_sleep(); } shm_network_stopall(); return 0; /* The shared memory manager should never return */ }
int main(void) { const char *path1="/usr/include/stdio.h"; const int ch1='A'; const char *path2="/usr/include/stdio.h"; const int ch2='B'; const char *path3="/usr/include/stdio.h"; const int ch3='C'; char *text3="\nThis is the test text #3 and integer: "; char text1[256],text2[256]; ShmLink link1,link2,link3; int size1,size2,err,i=0,res1=0,res2=0; size1=strlen(text3)+1; size2=sizeof(int); if( (err=shm_connect(&link3,path3,ch3,size1+size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for shm_link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link3)); return -1; } sleep(1); if( (err=shm_connect(&link2,path2,ch2,size1+size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for shm_link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link2)); return -1; } if( (err=shm_connect(&link1,path1,ch1,size1+size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for shm_link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link1)); return -1; } for(i=0;i<10;i++) { if( (err=shm_write(&link3,text3,0,size1))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link3)); return -2; } if( (err=shm_write(&link3,&i,size1,size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link3)); return -2; } if( (err=shm_read(&link1,text1,0,size1))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link1)); return -2; } if( (err=shm_read(&link1,&res1,size1,size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link1)); return -2; } if( (err=shm_read(&link2,text2,0,size1))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link2)); return -2; } if( (err=shm_read(&link2,&res2,size1,size2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link2)); return -2; } sleep(2); } if( (err=shm_disconnect(&link1))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link1)); return -4; } if( (err=shm_disconnect(&link2))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link2)); return -4; } if( (err=shm_disconnect(&link3))<0 ) { fprintf(stderr,"[%s:%d] Error #%d for link:\n%s", __FILE__,__LINE__,err,shm_strerror(&link3)); return -4; } return 0; }