当前位置:萝卜系统 > 硬件软件教程 > 详细页面

如何在Android中创建命名管道(mkfifo)?

如何在Android中创建命名管道(mkfifo)?

更新时间:2023-06-20 文章作者:未知 信息来源:网络 阅读次数:

根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

xml命名空间的创建语法_管道设计中如何创建步路点_创建命名管道

答案0 : (得分: 14)

Roosmaa的答案是正确的-mkfifo()仅调用mknod()创建一个特殊文件,而FAT32不支持它.

作为替代方案,您可能要考虑使用Linux的“抽象名称空间” UNIX域套接字. 它们应大致等效于命名管道. 您可以按名称访问它们,但它们不是文件系统的一部分,因此您不必处理各种权限问题. 请注意,套接字是双向的.

由于它是一个套接字,因此您可能需要INTERNET权限. 不确定.

创建命名管道_管道设计中如何创建步路点_xml命名空间的创建语法

以下是客户端/服务器示例代码的一小部分:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
/*
 * Create a UNIX-domain socket address in the Linux abstract namespace.
 *
 * The socket code doesnt 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] = \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 %s\n, 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 %s\n, 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;
}

答案1 : (得分: 8)

/ sdcard的默认文件系统是FAT32,它不支持命名管道.

管道设计中如何创建步路点_创建命名管道_xml命名空间的创建语法

在非root用户的设备上,您可以尝试创建这些管道的唯一可能位置是应用程序数据目录/data/data/com.example/. 注意: 您不应该对此值进行硬编码,请使用Context.getApplicationInfo(). dataDir.

但是请注意,每当用户使用Apps2SD或Google正式实现此支持时创建命名管道,都需要确保用户知道该应用程序无法存储在vfat文件系统中.

答案2 : (得分: 1)

我要附加接受的答案:

创建命名管道_管道设计中如何创建步路点_xml命名空间的创建语法

1)我可以使用此方法在Android应用程序的两个本机模块之间连接套接字.

2)write()应该处于循环中,因为它可能不会写入第一个请求的全部内容. 例如,它应如下所示:

void *p = buffer;
count = 0;
while ((count += write(clientSock, buffer, num_bytes - count)) < num_bytes)
{
    if (count < 0)
    {
        close(clientSock);
        errCode = count;
        break;
    }
    p += count;
}

上面显示的错误处理是不够的,因为一些错误代码仅意味着要重试. 请参阅编写文档.

xml命名空间的创建语法_管道设计中如何创建步路点_创建命名管道

答案3 : (得分: 1)

还有/ sqlite_stmt_journals(我们将其用于测试,我不知道此目录可以在操作系统更新中保留多长时间)

如果您需要IPC,最佳做法是使用Binders

如果只需要线程间通信,则可以通过JNI使用未命名的管道(可以正常工作)

答案4 : (得分: 0)

如果您使用Java编写此代码创建命名管道,则应使用PipedInputStream和PipedOutputStream.


本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-288040-1.html



温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html