示例#1
0
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 */
}
示例#2
0
文件: test3_1.c 项目: areinull/shmci
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;
}