#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ipc_msg.h" #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) int memfd_open(char* fd_path) { ssize_t len; int fd; struct stat st; fd = open(fd_path, O_RDWR); if (fd == -1) errExit("open"); if (fstat (fd, &st)) errExit ("fstat"); len = st.st_size; printf("length: %zu, atime: %lu.%lu\n", len, st.st_atim.tv_sec, st.st_atim.tv_nsec); return fd; } int memfd_read(int fd) { unsigned char* addr; struct stat st; ssize_t i, len; if (fstat (fd, &st)) errExit ("fstat"); len = st.st_size; addr = (unsigned char*) mmap (NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr == MAP_FAILED) errExit("mmap"); printf ("start: "); for (i = 0; i < 32; ++i) printf ("%i ", addr[i]); printf ("\nend: "); for (i = 0; i < 32; ++i) printf ("%i ", addr[len-32+i]); printf ("\ndone\n"); return len; } int main(int argc, char **argv) { int fd; int connect_fd; struct sockaddr_un srv_addr; char snd_buf[MAX_LEN] = {0}; char rcv_buf[MAX_LEN] = {0}; int ret; int i; char *fd_path; memfd_data_st memfd_data = {0}; int rcv_num = 0; connect_fd = socket(AF_UNIX, SOCK_STREAM, 0); if(connect_fd < 0) { perror("client create socket failed"); return 1; } srv_addr.sun_family = AF_UNIX; strcpy(srv_addr.sun_path, UNIX_DOMAIN); ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr)); if(ret == -1) { perror("connect to server failed!"); close(connect_fd); unlink(UNIX_DOMAIN); return 1; } printf("connect to server path:%s success!", srv_addr.sun_path); //memset(rcv_buf, 0, sizeof(rcv_buf)); //int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); //memcpy(&memfd_data, rcv_buf, sizeof(memfd_data_st)); memset(snd_buf, 0, 256); strcpy(snd_buf, HELLO_MSG); printf("sizeof(snd_buf): %ld\n", sizeof(snd_buf)); printf("send data to server... ...\n"); // for(i = 0; i < 4; i++) { write(connect_fd, snd_buf, sizeof(snd_buf)); } printf("send end!\n"); memset(rcv_buf, 0, sizeof(rcv_buf)); rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf)); if(rcv_num == 0) { close(connect_fd); return 0; } memcpy(&memfd_data, rcv_buf, rcv_num); printf("receive message from server,pid:%d, memfd:%d\n", memfd_data.pid, memfd_data.memfd); if ((memfd_data.pid != 0) && (memfd_data.memfd != 0)) { char fd_path[256] = {0}; snprintf(fd_path, sizeof(fd_path), "/proc/%d/fd/%d", memfd_data.pid, memfd_data.memfd); fd = memfd_open(fd_path); ret = memfd_read(fd); } close(connect_fd); return 0; }