如何重定向shell创建的管道

时间:2016-04-19 11:22:58

标签: c pipe

我写了一个打印消息的程序,等待用户输入并再次打印消息。下面的简单示例说明了这一点。该程序以'prog |启动tr'a-z''A-Z'。只有最后一个印刷品应由'tr'a-z''A-Z'处理。

int main ()
{
    char name[99];
    printf ("Your name: ");
    scanf ("%98s", name);
    printf ("Your name is: %s\n", name);

    return 0;
}

我用pipe,dup,dup2尝试了很多,但到目前为止还没有任何工作。有谁知道如何解决我的问题?

3 个答案:

答案 0 :(得分:1)

如果您想使用此命令启动程序,那么执行所需操作的唯一方法是在stderr中打印消息:

fprintf (stderr, "Your name: \n");

答案 1 :(得分:0)

经过一些研究,我发现how to check if stdout is directed to a terminalhow to write to terminal即使没有处理它。

所以你可以按照以下步骤进行:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

int print_to_terminal(const char *message)
{
    FILE *termout;

    if (isatty(STDOUT_FILENO))
    {
        termout = stdout;
    }
    else
    {
        termout = fopen("/dev/tty", "w");
        if (termout == NULL)
        {
            perror("open");
            return EOF;
        }
    }

    int result = fprintf(termout, "%s\n", message);

    if (termout != stdout)
    {
        fclose(termout);
    }

    return result;
}

int main()
{
    printf("Start of program.\n");
    print_to_terminal("Don't worry, be happy.");
    printf("End of program.\n");

    return 0;
}

即使stdout和stderr都指向文件,也应该在当前终端中打印消息。

答案 2 :(得分:0)

使用tail:http://linux.die.net/man/1/tail

prog | tail -n 1 | tr 'a-z' 'A-Z'