尝试使用系统调用重定向输入和输出

时间:2015-04-01 10:27:43

标签: c system-calls

我正在尝试从特定文件读取输入并使用unix(sys调用)将其写入特定文件。必须以某种方式创建输出部分。

我想做类似以下的事情: ./a.out< input.txt&gt; output.txt的 仅使用以下函数:fork,dup.dup2,exec,open,write,read 代码是这样的:

pid_t   pid, runner;
char *path = argv[1];
char enter[] = "/home/demo/Desktop/OS/Ex1/Ex12/code/input.txt";
char to[] = "/home/demo/Desktop/OS/Ex1/Ex12/Ex1/ronen/";
char *out = "/home/demo/Desktop/OS/Ex1/Ex12/Ex1/ronen/out1.txt";
char *args[] = {to, "./a.out","<",enter,">",out, NULL};
char *args2[] = {"cd", to, "./a.out","<",enter,">",to ,NULL};
if ((runner = fork()) < 0) {perror("could not make fork");}
else if (runner == 0) {
    printf("true\n");
    execvp(args2[0],args2);
} else if (runner != 0) {
    waitpid(runner,0,0);
    printf("done\n");
}

当我将“a.out”文件放在桌面上时,它会正常工作。

然而有谁知道如何重定向exec函数转到我的spefic文件夹?所以我不必将可执行文件传递到桌面?

2 个答案:

答案 0 :(得分:0)

对于读写文件,您只需使用普通的readwrite函数;您首先需要拥有文件描述符,因此您需要使用fopen

总而言之,我见过的每一篇C教程都涵盖了在fork触及之前很长时间的开放和写作,所以我想知道你一直关注的是什么。我真的只是建议找一个你喜欢的C介绍并阅读前几页;如果您已经了解fork的作用,那对您来说这将是一块蛋糕。

编辑:另外,您可能会误解

program arguments <from_file >to_file 

在shell上使用它时会这样做:

shell 读取该行,并调用program,将其arguments作为...参数传递。它检测到该行上的<>以及&#34;弯曲&#34;标准输入和输出文件描述符(是的,标准输入和输出就像那样),实际上是fopen个ed文件。

program永远不会看到<from_file>to_file

您在评论中

编辑

  

我不能使用fopen和那些功能。只有.fork,dup.dup2,exec,open,write,read

显然,fopen只是open的包装器,并返回文件描述符open返回。

此外,您的程序使用了大量的libc函数;如果您只允许write,则不应使用printf,这是puts的一个非常方便的格式化包装器,它是{write的包装器。 1}}。类似的内容适用于您调用的所有函数,即。 waitpidexecvpperror。您应首先清楚地为自己记录您的要求。

答案 1 :(得分:0)

我假设你的问题是:如何编写一个程序,启动第二个程序,其标准输入和输出被重定向到文件?

在这种情况下,您需要遵循以下顺序:

在主程序中

  • fork()子进程
  • 使用从fork()
  • 获取的pid的子进程的wait()

在子子流程

  • 关闭(0)标准输入
  • 打开()输入文件(带读取模式)
  • 关闭(1)标准输出
  • 打开()输出文件(带写入模式)
  • exec()目标程序

如何使用系统调用

R ead T F ine M anuals

所有这些手册页都包含示例代码。通过阅读所有这些内容,您应该有足够的示例代码来编写整个程序。