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

问题描述:

我试图从特定的文件读取输入并使用unix(sys调用)将其写入到特定的文件。输出部分必须以某种方式创建。试图重定向输入和输出使用系统调用

我想要做类似如下:只使用这些功能 ./a.out < input.txt中> output.txt的 :叉,dup.dup2,EXEC,打开,写入,读取 代码这个:

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文件夹?所以我不必将可执行文件传递到桌面?

+0

你没有得到'shell'和'syscall'的概念。您应该首先尝试更好地理解什么是系统调用,以及在编写代码之前shell是什么。例如,你正试图将一个shell命令行传递给内核。这是无稽之谈,shell **负责将命令行转换为fork/exec序列的正确参数。 – fjardon 2015-04-01 11:44:02

+0

是你的问题:*如何编写一个程序,启动第二个程序的标准输入和输出被重定向到文件?* – fjardon 2015-04-01 11:50:33

对于读取和写入文件,您只需使用正常的readwrite函数;你首先需要一个文件描述符,所以你需要使用fopen。总而言之,我见过的每个C教程都涵盖了开放和写作很久之前它会触及fork,所以我不知道你一直在关注什么。我真的只是推荐找一个你喜欢的C的头版,并阅读前几页;如果你已经明白了fork的作用,这对你来说将是一块蛋糕。

编辑:还有,你可能会误会使用的shell,当什么

program arguments <from_file >to_file 

做:

外壳读取该行,并调用program,传递arguments作为。 ..论点。它检测该行上的<>,并“弯曲”标准输入和输出文件描述符(是的,标准输入和输出表现如此),实际上是fopen ed文件。

program从未见过<from_file也不>to_file

编辑在您的评论对你说:

我不能使用的fopen和这些功能。只有.fork,dup.dup2,EXEC,打开,写,读

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

另外,你的程序使用了大量的libc函数;如果只允许使用write,则不应使用printf,这是puts的非常方便的格式化包装,它是write的包装。类似的东西适用于全部您调用的函数,即。 waitpidexecvpperror。首先你应该记录你自己的需求

+0

嗨,首先感谢您的注意! 但我不能使用fopen和那些功能。只有.fork,dup.dup2,exec,打开,写入,读取 – user3253375 2015-04-01 11:11:20

+0

我不明白如何做一个命令“./a.out output.txt” 使用sys调用dup – user3253375 2015-04-01 11:35:31

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

在您需要按照这个顺序的话:使用pid

在主程序

  • fork()的子进程
  • wait()的子进程()

在子子进程

  • 关闭(0)的标准输入
  • open()的输入文件(读取模式)
  • 接近(1)在标准输出
  • open()的输出文件(具有写入模式)
  • EXEC()目标程序

如何使用系统调用

ř EAD Ť˚F INE 中号 anuals

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

+0

我的问题是关于exec我不明白的命令。例如,我想使用“a.out”coomand并且只使用该命令。什么是我必须通过execvp函数的论据。 谢谢。 – user3253375 2015-04-01 12:07:35