我想运行:cat
somefile | program
> UNIX系统中的outputText。
我看过许多东西,比如管道,使用popen,dup2等;我迷路了。
基本代码应为:
cat
读取program
产生的任何输出并做一些魔术,然后将数据输出到outputText。请问任何建议?
P.S。 这些文件是二进制文件。
更新
我发现这个代码符合上面规定的命令......但是 它做了我不想要的事情。
sort
?我试图删除东西,但后来我收到错误,程序没有运行。cat
读取数据为二进制请提示?
int main(void)
{
pid_t p;
int status;
int fds[2];
FILE *writeToChild;
char word[50];
if (pipe(fds) == -1)
{
perror("Error creating pipes");
exit(EXIT_FAILURE);
}
switch (p = fork())
{
case 0: //this is the child process
close(fds[1]); //close the write end of the pipe
dup2(fds[0], 0);
close(fds[0]);
execl("/usr/bin/sort", "sort", (char *) 0);
fprintf(stderr, "Failed to exec sort\n");
exit(EXIT_FAILURE);
case -1: //failure to fork case
perror("Could not create child");
exit(EXIT_FAILURE);
default: //this is the parent process
close(fds[0]); //close the read end of the pipe
writeToChild = fdopen(fds[1], "w");
break;
}
if (writeToChild != 0)
{
while (fscanf(stdin, "%49s", word) != EOF)
{
//the below isn't being printed. Why?
fprintf(writeToChild, "%s end of sentence\n", word);
}
fclose(writeToChild);
}
wait(&status);
return 0;
}
答案 0 :(得分:1)
这是我的建议,因为你想读写二进制文件:
#include <stdio.h>
int main (void) {
if (!freopen(NULL, "rb", stdin)) {
return 1;
}
if (!freopen(NULL, "wb", stdout)) {
return 1;
}
char buf[4];
while (!feof(stdin)) {
size_t numbytes = fread(buf, 1, 4, stdin);
// Do something with the bytes here...
fwrite(buf, 1, numbytes, stdout);
}
}
答案 1 :(得分:0)
为了能够读取cat
的输出(stdout),你不需要管道我发现的任何东西,感谢你们!我被管道拖了一脚...
所以如果你运行“cat
somefile | program
”,其中 somefile 包含二进制数据......
你只会看到somefile包含的内容,在终端上重印。
谢谢!现在我可以写完program
。
/*program.c*/
int main()
{
int i, num;
unsigned char block[2];
while ((num = fread(block, 1, 2, stdin)) == 2)
{
for(i = 0; i < 2; i++)
{
printf("%02x", block[i]);
}
}
}