亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 使用unix域套接字在進程之間傳遞文件描述符

使用unix域套接字在進程之間傳遞文件描述符 時間:2018-09-20      來源:未知

在多進程的程序中經常需要在不同的進程之間傳遞文件描述符,但是不同的進程之間文件描述代表的是不同的對象。那么如何在不同的進程中使用相同的文件描述符,而且代表的是相同的對象呢?

在linux中可以使用unix的域套接字方法來實現在不同的進程之間傳遞文件描述符, 需要使用socketpair函數創建一個套接字管道,該管道是雙向的,每一端都是可讀可寫的。

socketpair的 函數原型:

int socketpair(int domain, int type, int protocol, int sv[2]);

參數:

Domain: 通信類型比如AF_UNIX

type:套接字類型比如 SOCK_STREAM、 SOCK_DGRAM

protol:只能為0

sv: 包含兩個元素的數組名

函數執行完成之后會得到sv[0]和sv[1]兩個套接字描述符。在不同的進程之間進行通信時可以使用如下的方法:

每個進程關閉一個描述符,然后使用一個描述符通信。那么有了管道后,如何傳遞文件描述符呢?那就得需要使用sendmsg、recvmsg函數。

sendmsg函數用來給一個特性的套接字描述符發送消息。

recvmsg 函數用來從一個特定的套接字中讀取消息。

函數原型如下:

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

這兩個函數的使用關鍵是struct msghder和 struct cmsghdr?兩個結構體的使用。

首先, stuct msghdr結構體是用來發送和接收消息的結構體,成員如下:struct msghdr {

void *msg_name; //套接字的地址

socklen_t msg_namelen;//套接字地址長度

struct iovec *msg_iov;//消息結構體的地址

size_t msg_iovlen;//msg_iov結構體的個數

void *msg_control;//消息控制緩沖區

size_t msg_controllen;//消息控制緩沖區的長度

int msg_flags;//接收消息時的標志位

};

stcut cmsghdr結構體成員如下:

struct cmsghdr

{

cmsg_len // 附屬數據的字節計數,這包含結構頭的尺寸。這個值是由CMSG_LEN()宏計算的。

cmsg_level // 這個值表明了原始的協議級別(例如,SOL_SOCKET)。

cmsg_type // 這個值表明了控制信息類型(例如,SCM_RIGHTS)。

}

示例代碼如下:

1)接收描述符代碼

int my_recv();

int main(int argc, const char *argv[])

{

int fd;

char buf[32] = {0};

if ((fd = my_recv()) < 0)

{

printf("fail to my_recv\n");

return -1;

}

read(fd, buf, sizeof(buf));

puts(buf);

close(fd);

return 0;

}

int my_recv()

{

int sockfd[2];

int status = -1;

pid_t pid;

char itoa_fd[10] = {0};

if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) < 0)

{

perror("fail to socketpair");

return -1;

}

pid = fork();

if (pid < 0)

{

perror("Fail to fork");

return -1;

}

else if (pid == 0)

{

close(sockfd[0]);

sprintf(itoa_fd, "%d", sockfd[1]);

if (execl("./sendmsg", "sendmsg", itoa_fd, NULL) < 0)

{

perror("fail to execl");

exit(-1);

}

}

else

{

close(sockfd[1]);

waitpid(pid, &status, 0);

if (WEXITSTATUS(status) != 0)

{

close(sockfd[0]);

printf("sendmsg fail to exit\n");

return -1;

}

struct msghdr msg;

struct cmsghdr *cmsg;

struct iovec iv;

char buf[CMSG_SPACE(sizeof(int))] = {0};

char recv_buf[32] = {0};

msg.msg_control = buf;

msg.msg_controllen = sizeof(buf);

//用來接收sendmsg發送的消息

iv.iov_base = recv_buf;

iv.iov_len = sizeof(recv_buf);

msg.msg_iov = &iv;

msg.msg_iovlen = 1;

msg.msg_name = NULL;

msg.msg_namelen = 0;

if (recvmsg(sockfd[0], &msg, 0) < 0)

{

perror("fail to recvmsg");

return -1;

}

if ((cmsg = CMSG_FIRSTHDR(&msg)) != NULL &&cmsg->cmsg_len == CMSG_LEN(sizeof(int)))

{

close(sockfd[0]);

return *(int *)CMSG_DATA(cmsg);

}

close(sockfd[0]);

return -1;

}

}

2)發送描述符代碼

int my_send(int sockfd, int file);

int main(int argc, const char *argv[])

{

int fd;

if ((fd = open("file", O_RDONLY)) < 0)

{

perror("fail to open the file");

return -1;

}

if (my_send(atoi(argv[1]), fd) < 0)

{

puts("fail to my_send");

close(fd);

return -1;

}

return 0;

}

int my_send(int sockfd, int file)

{

struct msghdr msg;

struct cmsghdr *cmsg;

struct iovec iv;

char buf[CMSG_SPACE(sizeof(int))] = {0};

char send_buf[32] = "helloworld";

bzero(&msg, sizeof(msg));

msg.msg_control = buf;

msg.msg_controllen = sizeof(buf);

//必須要添加消息這一部分,否則sendmsg無法發送

iv.iov_base = send_buf;

iv.iov_len = sizeof(send_buf);

msg.msg_iov = &iv;

msg.msg_iovlen = 1;

msg.msg_name = NULL;

msg.msg_namelen = 0;

cmsg = CMSG_FIRSTHDR(&msg);

cmsg->cmsg_len = CMSG_LEN(sizeof(int));

cmsg->cmsg_level = SOL_SOCKET;

cmsg->cmsg_type = SCM_RIGHTS;

*(int*)CMSG_DATA(cmsg) = file;

return sendmsg(sockfd, &msg, 0);

}

上一篇:ViewPager介紹和使用說明

下一篇:如何寫文檔

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 欧美精品第一区 | 欧美另类69xxxxx视频 | 天堂中文在线网 | 日本免费色视频 | 韩国成人在线视频 | 欧美3区| 国产国语一级毛片在线视频 | 精品国产综合区久久久久久 | 日本aⅴ日本高清视频影片www | 六月色| 99热国产这里只有精品免费 | 在线99| 男女动态视频在线观看 | 天堂中文在线乱码 | 欧美xxxx新一区二区三区 | 人人揉揉香蕉大免费不卡 | 国产区视频在线观看 | 精品卡一卡二 卡四卡视频 精品卡一卡二卡四卡三卡 精品乱久久 | 欧洲亚洲一区二区三区 | 青娱乐在线视频免费观看 | 久久这里只有精品2 | 欧美正片 | 久久不见久久见免费影院 | 高清不卡日本v在线二区 | 欧美日韩一区二区三区视视频 | 米奇7777狠狠狠狠视频影院 | 九九热在线免费观看 | 欧美热妇xxxx欧美热妇 | 久久亚洲精品中文字幕二区 | 国产一区二区三区波多野吉衣 | 国产精品66在线观看 | 果冻传媒mv国产推荐视频 | 国内自产拍自a免费毛片 | 国产欧美日本亚洲精品一4区 | 国产三级在线视频播放线 | 99re热在线视频| 欧美人与物videos另类3d | 欧美肥胖老太bbw | 青青久久99久久99久久999 | 激情综合婷婷 | 午夜视频十八嗯嗯啊免费 |