我有一个服务器和客户端应用程序,使用 IPC 队列。服务器(目前)只是发回从客户端收到的文本。我希望服务器将消息中的字母从小写更改为大写。我想知道如何实现它。我必须创建管道吗?我正在考虑从接收到的队列中“抓取”文本,对其执行 tr 命令并发送回客户端。但是如果使用管道,我从哪里得到文件描述符?我的意思是,int fds[2];
和 pipe(fds);
给了我一个管道,但它不适用于像这样的两个字符数组:
int fds[2];
pipe(fds);
char a[100];
char b[100];
fds[0] = open(a,O_RDOLNY);
fds[1] = open(b,O_WRONLY);
如何对消息队列保存的文本执行 tr 命令?
最佳答案
我不会为此fork
一个程序:
p = str;
while (*p) {
*p = toupper(*p);
p++;
}
更严重的是,您可能应该使用 popen
自动(并且稳健地) fork 并使用管道为您设置 FILE *
。
FILE *cmd = popen("tr ... ", "r");
然后从中简单地fgets
(不要忘记pclose
它)。遗憾的是,在 Linux 上您不能同时写入和读取打开的文件(在 FreeBSD 上可以)。
编辑
由于这是一道家庭作业题(坦率地说,因为我认为在晚上的这个时候完全正确地完成它并不容易),下面是 popen
实际做的事情:
- 创建管道
- fork 一个将运行命令的 shell
- 返回一个
FILE *
(可能通过fdopen
)
最后一步实际上是可选的,因为您总是可以直接从文件描述符中读取。
关于c - 在队列上执行 tr 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8639619/