2015-04-01 94 views
-2

我試圖從特定的文件讀取輸入並使用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

回答

0

對於讀取和寫入文件,您只需使用正常的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

0

我假設你的問題是:如何編寫啓動第二個程序的程序,該程序的標準輸入和輸出被重定向到文件?

在您需要按照這個順序的話:使用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