在C

时间:2015-05-20 17:40:52

标签: c pipe output ubuntu-12.04

我试图解决问题,因为我正在学习使用C语言中的系统调用。我使用的是Ubuntu 12.04 64位。

我有这样的声明:

实现一个代码,允许将标准从延迟到文件(标准输出)的两个命令中重定向,并将所有错误输出重定向到另一个文件(错误文件)。将使用out参数(对于标准输出的名称)和参数-err(对于错误文件的名称)来指定文件的名称。 语法:after2 [args ...] - do [args ...] - out --err

声明中未指明,但我认为我需要使用管道。

此外,我无法使用printf,scanf,getc ...系列函数。

我有那段代码:

#include <syscall.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>


int main(void) 
{
    int cmd1 = system("sleep 5");
    int cmd2 = write(1, "hello world", 11);


    if((cmd1 != (0)))
    {
        write(1,"error in command 1",18);
    }
    if((cmd1==(0)))
    {
        write(1, "hello world", 11);
    }
    return EXIT_SUCCESS;
} 

我的问题是,您是否了解类似问题的一些例子?我寻找一些,但我找不到,如果你知道其他方式来帮助我,我很乐意接受。

我发布了我现在的代码而没有删除最后一个版本,通过这种方式所有人都可以看到进化。

#include <syscall.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[])
{
    const char* cmd1 = system("sleep 5");
    const char* cmd2 = write(1, "hello world", 11);
    int out_fd = creat("out.txt",0644);
    int err_fd = creat("err.txt",0644);


    if(out_fd < 0){
        write(2, "Can't open file out.txt", strlen("Can't open file out.txt"));
        dup2(err_fd, 2);
        write(2, "Can't open file out.txt \n", strlen("Can't open file out.txt \n"));

        return -1;
        }else if(err_fd < 0){
            write(2, "Can't open file err.txt", strlen("Can't open file err.txt"));
            dup2(err_fd, 2);
            write(2, "Can't open file err.txt \n", strlen("Can't open file err.txt \n"));

            return -1;
        }
    if((cmd1 !=(0)))
    {
        write(2, "There is an error on command1", strlen("There is an error on command1"));
        dup2(err_fd, 2);
        write(2, "Error on command1 \n", strlen("Error on command1 \n"));

        return -1;
        }else if((cmd1==(0)))
        {
            write(1, "success on command1", strlen("success on command1"));
            dup2(out_fd, 1);
            write(1, "success on command1 \n", strlen("success on command1 \n"));
            write(1, "hello world", 11);

            if((cmd2==(0)))
            {
                write(1, "hello world", strlen("hello world"));
                dup2(out_fd, 1);
                write(1, "hello world \n", strlen("hello world \n"));

            }
            if((cmd2 != (0)))
            {
                write(2, "There is an error on command2", strlen("There is an error on command2"));
                dup2(err_fd, 2);
                write(2, "Error on command2 \n", strlen("Error on command2 \n"));

            }
        }
return 0;
}

这次打印在shell hello worldsuccess on command1There is an error on command2中,并且在out.txt中的command1和hello world上成功,并且在err.txt中的command2上有错误,但我不知道为什么打印出现错误在command2上同时打印hello world,任何想法

显然我还有一些错误但我不确定如果有人能帮助我我需要做什么我会感到高兴!

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用dup2将STDIN和STDERR重定向到您已打开的任何其他文件。

int out_fd = creat("out.txt",0644);
if(out_fd < 0){
    printf("Could not open file for standard output\n");
}
write(STDOUT_FILENO, "This is printed on the standard output", strlen("This is printed on the standard output"));
dup2(out_fd, STDOUT_FILENO);
write(STDOUT_FILENO, "This goes into out.txt file \n", strlen("This goes into out.txt file \n"));

你可以为stderr做同样的事。

答案 1 :(得分:2)

write(1, ...写入标准输出。 write(2,...写入标准错误。因此,您所要做的就是重新打开这些文件描述符,以便它们进入指定的文件。例如,

fd1 = open("outputfile", O_WRONLY); dup2(fd1, 1);
fd2 = open("errorfile", O_WRONLY); dup2(fd2, 2);

之后,任何标准输出都将进入outputfile,任何错误输出都将转到errorfile

但首先,您必须解析命令行选项(在argv中找到,这是main的第一个参数,其长度由main的第二个参数给出)找到--out--err选项并获取其值。

答案 2 :(得分:0)

好吧,最后我得到了一个似乎可行的代码,我更改了<a class="link" id="link1" href="#">Foo</a> <a class="link" id="link2" href="#">Foo</a> <a class="link" id="link3" href="#">Foo</a> <a class="link" id="link4" href="#">Foo</a> <a class="link" id="link5" href="#">Foo</a> <a class="link" id="link6" href="#">Foo</a> <a class="link" id="link7" href="#">Foo</a> <a class="link" id="link8" href="#">Foo</a> <a class="link" id="link9" href="#">Foo</a> <a class="link" id="link10" href="#">Foo</a> <a class="link" id="link11" href="#">Foo</a> <a class="link" id="link12" href="#">Foo</a> <a class="link" id="link13" href="#">Foo</a> <a class="link" id="link14" href="#">Foo</a> <a class="link" id="link15" href="#">Foo</a> <a class="link" id="link16" href="#">Foo</a> <a class="link" id="link17" href="#">Foo</a> <a class="link" id="link18" href="#">Foo</a> <a class="link" id="link19" href="#">Foo</a> <a class="link" id="link20" href="#">Foo</a> <a class="link" id="link21" href="#">Foo</a> 的命令cmd2 = write(1, "hello world", 11);,因为我在编写一个写入函数的文件时遇到了麻烦改变这一点,我迅速实现了我的目标:

cmd2 = system("echo $HOME");

只有一点问题,当我构建一个exe时出现警告谁说: 警告:隐含的功能声明&#39; creat&#39; [ - Wimplicit-function-declaration]

int out_fd = creat(&#34; out.txt&#34;,0644);

如果有人知道如何纠正,请告诉我。谢谢你的帮助!