#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include <unistd.h>
|
#include <errno.h>
|
#include <signal.h>
|
#include <sys/types.h>
|
#include <sys/stat.h>
|
|
#include "memfd.h"
|
#include "ipc_msg.h"
|
|
int g_memfd = 0;
|
|
void handler(){
|
|
printf("clean program start\n");
|
//unlink(UNIX_DOMAIN);
|
remove(UNIX_DOMAIN);
|
printf("clean end.\n");
|
}
|
|
int shm_write(int fd)
|
{
|
struct stat st;
|
ssize_t len;
|
int ret = 0;
|
unsigned char* paddr;
|
|
if (fstat (fd, &st))
|
errExit ("fstat");
|
len = st.st_size;
|
|
char *content = "hello world!\n";
|
ret = basic_shm_mmap (fd, &paddr);
|
if (ret < 0)
|
errExit("basic_shm_mmap");
|
|
memcpy(paddr, content, strlen(content));
|
|
printf("length: %zu, atime: %lu.%lu\n", len, st.st_atim.tv_sec, st.st_atim.tv_nsec);
|
return len;
|
}
|
|
|
|
int proc_memfd(struct user_data* rdata)
|
{
|
int fd = rdata->fd;
|
unsigned int n_size;
|
char line[MAX_LEN]= {0};
|
int n = 0;
|
int nwrite = 0;
|
int data_size = 0;
|
memfd_data_st memfd_data = {0};
|
|
if(rdata->n_size <= 0 || fd < 0)
|
{
|
return -1;
|
}
|
|
if(0 == strncmp(rdata->line, HELLO_MSG, strlen(HELLO_MSG)))
|
{
|
memfd_data.memfd = g_memfd;
|
memfd_data.pid = getpid();
|
memfd_data.data = NULL;
|
memfd_data.len = 0;
|
data_size = sizeof(memfd_data_st) + memfd_data.len;
|
memcpy(line, &memfd_data, data_size);
|
}
|
else
|
{
|
return -1;
|
}
|
|
n = data_size;
|
while(n>0)
|
{
|
nwrite = write(rdata->fd, line+data_size-n,n);////ET
|
if( nwrite < n )
|
{
|
if((nwrite==-1) && (errno != EAGAIN))
|
{
|
perror("write error");
|
}
|
if (errno == ECONNRESET)
|
{
|
close(rdata->fd);
|
printf("[SERVER] Error: send responce failed: %s\n", strerror(errno));
|
}
|
else if (nwrite == 0)
|
{
|
close(rdata->fd);
|
printf("[SERVER] Error: client closed connection.");
|
}
|
break;
|
}
|
n -= nwrite;
|
}
|
|
return nwrite;
|
|
}
|
|
/*define you our proc_memfd funtion to send your message to other processes,or just put it in shm,
|
notice the file description fd and the pid of creator to other*/
|
int main(int argc, char **argv)
|
{
|
char *name;
|
ssize_t len;
|
char * unixdomain = NULL;
|
int ret = 0;
|
|
if (argc < 3) {
|
fprintf(stderr, "%s name size [unix domain path]\n", argv[0]);
|
exit(EXIT_FAILURE);
|
}
|
|
name = argv[1];
|
len = atoi(argv[2]) * 1024LU * 1024LU * 1024LU;
|
unixdomain = argv[3];
|
|
signal(SIGTERM,handler);
|
signal(SIGABRT,handler);
|
signal(SIGSEGV,handler);
|
|
|
g_memfd = basic_shm_create(name, len);
|
ret = shm_write(g_memfd);
|
|
ret = basic_create_ipc_server(unixdomain);
|
if(ret < 0)
|
{
|
printf("failed to create ipc_server\n");
|
}
|
|
basic_shm_close(g_memfd);
|
return 0;
|
}
|