android管道使用方法,如何在Android中创建命名管道(mkfifo)?

#include

#include

#include

#include

#include

#include

/*

* Create a UNIX-domain socket address in the Linux "abstract namespace".

*

* The socket code doesn't require null termination on the filename, but

* we do it anyway so string functions work.

*/

int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen)

{

int nameLen = strlen(name);

if (nameLen >= (int) sizeof(pAddr->sun_path) -1) /* too long? */

return -1;

pAddr->sun_path[0] = ' '; /* abstract namespace */

strcpy(pAddr->sun_path+1, name);

pAddr->sun_family = AF_LOCAL;

*pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path);

return 0;

}

int main(int argc, char** argv)

{

static const char* message = "hello, world!";

struct sockaddr_un sockAddr;

socklen_t sockLen;

int result = 1;

if (argc != 2 || (argv[1][0] != 'c' && argv[1][0] != 's')) {

printf("Usage: {c|s}n");

return 2;

}

if (makeAddr("com.whoever.xfer", &sockAddr, &sockLen) < 0)

return 1;

int fd = socket(AF_LOCAL, SOCK_STREAM, PF_UNIX);

if (fd < 0) {

perror("client socket()");

return 1;

}

if (argv[1][0] == 'c') {

printf("CLIENT %sn", sockAddr.sun_path+1);

if (connect(fd, (const struct sockaddr*) &sockAddr, sockLen) < 0) {

perror("client connect()");

goto bail;

}

if (write(fd, message, strlen(message)+1) < 0) {

perror("client write()");

goto bail;

}

} else if (argv[1][0] == 's') {

printf("SERVER %sn", sockAddr.sun_path+1);

if (bind(fd, (const struct sockaddr*) &sockAddr, sockLen) < 0) {

perror("server bind()");

goto bail;

}

if (listen(fd, 5) < 0) {

perror("server listen()");

goto bail;

}

int clientSock = accept(fd, NULL, NULL);

if (clientSock < 0) {

perror("server accept");

goto bail;

}

char buf[64];

int count = read(clientSock, buf, sizeof(buf));

close(clientSock);

if (count < 0) {

perror("server read");

goto bail;

}

printf("GOT: '%s'n", buf);

}

result = 0;

bail:

close(fd);

return result;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值