根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。
答案0 : (得分: 14)
Roosmaa的答案是正确的-mkfifo()仅调用mknod()创建一个特殊文件,而FAT32不支持它.
作为替代方案,您可能要考虑使用Linux的“抽象名称空间” UNIX域套接字. 它们应大致等效于命名管道. 您可以按名称访问它们,但它们不是文件系统的一部分,因此您不必处理各种权限问题. 请注意,套接字是双向的.
由于它是一个套接字,因此您可能需要INTERNET权限. 不确定.
以下是客户端/服务器示例代码的一小部分:
#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,它不支持命名管道.
在非root用户的设备上,您可以尝试创建这些管道的唯一可能位置是应用程序数据目录/data/data/com.example/. 注意: 您不应该对此值进行硬编码,请使用Context.getApplicationInfo(). dataDir.
但是请注意,每当用户使用Apps2SD或Google正式实现此支持时创建命名管道,都需要确保用户知道该应用程序无法存储在vfat文件系统中.
答案2 : (得分: 1)
我要附加接受的答案:
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;
}
上面显示的错误处理是不够的,因为一些错误代码仅意味着要重试. 请参阅编写文档.
答案3 : (得分: 1)
还有/ sqlite_stmt_journals(我们将其用于测试,我不知道此目录可以在操作系统更新中保留多长时间)
如果您需要IPC,最佳做法是使用Binders
如果只需要线程间通信,则可以通过JNI使用未命名的管道(可以正常工作)
答案4 : (得分: 0)
如果您使用Java编写此代码创建命名管道,则应使用PipedInputStream和PipedOutputStream.
本文来自本站,转载请注明本文网址: http://www.pc-fly.com/a/jisuanjixue/article-288040-1.html
|