在队列上执行tr命令?

时间:2011-12-26 22:39:03

标签: c linux queue client-server exec

我有一个使用IPC队列的服务器和客户端应用程序。服务器(现在)只是简单地发回从客户端收到的文本。我希望服务器将消息中的字母从大写更改为大写。我想知道如何实现它。我必须创建一个管道吗?我正在考虑从接收到的队列中“抓取”文本,在其上执行tr命令并发送回客户端。但是如果使用管道,我从哪里获取文件描述符?我的意思是,int fds[2];pipe(fds);给了我一个管道,但是它没有像这样处理两个char数组:

int fds[2];
pipe(fds);
char a[100];
char b[100];
fds[0] = open(a,O_RDOLNY);
fds[1] = open(b,O_WRONLY);

如何对邮件队列所持文本执行tr命令?

1 个答案:

答案 0 :(得分:1)

我不会fork这个程序:

p = str;
while (*p) {
    *p = toupper(*p);
    p++;
}

更严重的是,您应该使用popen自动(并且健壮)分叉并使用管道为您设置FILE *

FILE *cmd = popen("tr ... ", "r");

然后从中简单fgets(不要忘记pclose它)。可悲的是,在Linux上你不能同时写入和读取一个popened文件(你可以在FreeBSD上)。

修改

因为这是一个家庭作业问题(坦白说,因为我觉得在夜间的这个时候完全没法完成它是微不足道的),这是popen实际上做的事情:

  • 创建管道
  • 分叉将运行命令的shell
  • 返回FILE *(可能通过fdopen

最后一步是可选的,因为你总是可以直接从文件描述符中读取。