c - 在队列上执行 tr 命令?

标签 c linux queue client-server exec

我有一个服务器和客户端应用程序,使用 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/

相关文章:

c - Linux 上的 "Alarm clock"消息

c++ - Visual Studio 2017 Linux 远程构建 - 在每个构建中重新编译所有 cpp 文件

linux - 未安装软件包 libc6

c - 我需要有关优先级队列和搜索的程序的最佳实现的建议

java - 在Java中使用堆栈创建队列

java - 使用链表实现队列时出现 NullPointerException

c - Swift.String 到 CMutablePointer<CChar>

c - 基本 Bool 函数给出段错误

c - 为什么这个简单的 C 示例以段错误结束?

c - 如何检查 execl() 是否成功(多进程)