#include #include #include #include #include #include #include #include #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; }