#ifndef IPC_MSG_H #define IPC_MSG_H #include #include #include #include #ifdef __cplusplus extern "C" { #endif #define UNIX_DOMAIN "/tmp/UNIX.domain" #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) #define MAX_LEN 4096 #define GET_MEMFD_MSG "basic_get_memfd" #define GET_DATA_MSG "basic_get_data" #define GET_CUSTOM_MSG "basic_get_custom" #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) ({\ const typeof(((type *)0)->member) * __mptr = (ptr);\ (type *)((char *)__mptr - offsetof(type, member)); } typedef struct memfd_data { pid_t pid; int memfd; void * data; int len; } memfd_data_st; struct user_data { int fd; unsigned int n_size; char line[MAX_LEN]; }; typedef int (*wfunc)(struct user_data*, void *arg, int len); typedef struct arg_struct { wfunc wfunc; void * args; int len; }args_data_st; typedef struct custom_data{ int memfd; void * data; int len; }st_custom_data; #define READ_THREAD_NUM 2 #define WRITE_THREAD_NUM 2 int file_exists(char *filename); int proc_msg(struct user_data* rdata, void * arg, int len); int basic_create_ipc_server(char * unix_domain_path, args_data_st * pargs_data_st); int basic_create_ipc_client(char * unix_domain_path, char * send_buf, int send_len, void ** pptr_recv_buf, int *ptr_recv_len); int send_fd_sendmsg(int fd, memfd_data_st** ppmemfd_data); /** * @brief 发送目标文件描述符 * @param fd 传递信息的 UNIX 域 文件描述符 * @param fd_to_send 待发送的文件描述符 */ int send_fd_args_sendmsg(int fd, int fd_to_send, pid_t pid, void **ppdata, int len); /** * @brief 接受文件描述符 * @param fd 传递信息的 UNIX 域 文件描述符 */ int recv_fd_recvmsg(int fd, memfd_data_st** ppmemfd_data); #ifdef __cplusplus } #endif #endif