linux 重定向 2gt;gt;,编写我自己的linux shell I / O重定向’gt;’函数
我正在編寫重定向函數,將命令的輸出寫入給定的文件名.
例如:
echo Hello World> hello.txt會將’Hello World’寫入hello.txt.
ls -al> file_list.txt會將當前目錄中所有文件/目錄名稱的列表寫入file_list.txt.
到目前為止,我的功能定義為:
int my_redirect(char **args, int count) {
if (count == 0 || args[count + 1] == NULL) {
printf("The redirect function must follow a command and be followed by a target filename.\n");
return 1;
}
char *filename = args[count + 1];
//Concatenates each argument into a string separated by spaces to form the command
char *command = (char *) malloc(256);
for (int i = 0; i < (count); i++) {
if (i == 0) {
strcpy(command, args[i]);
strcat(command, " ");
}
else if (i == count - 1) {
strcat(command, args[i]);
}
else {
strcat(command, args[i]);
strcat(command, " ");
}
}
//command execution to file goes here
free(command);
return 1;
}
其中args [count]是“>”.
如何執行args [0]到args [count-1]的字符串給出的命令到args [count 1]給出的文件?
編輯
這些是我們給出的指示:
“通過向文件添加stdout的重定向來改進你的shell.只有在完成功能后才嘗試1.為>解析行,將所有內容作為命令,然后將第一個單詞作為文件名(忽略> ;,|等).
標準輸出被寫出到文件描述符1(stdin為0,stderr為2).因此,可以通過打開文件,并使用dup2系統調用將其文件描述符復制到1來實現此任務.
int f = open( filename , O_WRONLY|O_CREAT|O_TRUNC, 0666) ;
dup2( f , 1 ) ;
注意:使用系統調用open not library wrapper fopen here.“
解決方法:
如果允許您以特殊方式解決此問題,那么它僅適用于一系列問題,例如將命令的stdout捕獲到文件中,您可以使用< stdio中的popen()函數重新發明輪子.H取代.
該計劃草圖:
>確定輸出文件名
>打開輸出文件進行寫入
>確定命令和參數
>構造從args到>的命令字符串.
>調用FILE * cmd = popen(命令,“r”);
>從cmd流讀取行,寫入輸出文件
>在cmd流上沒有EOF的情況下轉到6.
> pclose(cmd),fclose輸出流
只有當您的教師不希望您使用fork,dup和friends時才這樣做.
標簽:shell,c-3,linux,io-redirection
來源: https://codeday.me/bug/20190711/1431445.html
總結
以上是生活随笔為你收集整理的linux 重定向 2gt;gt;,编写我自己的linux shell I / O重定向’gt;’函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: acer p245 linux换win7
- 下一篇: 2007年9月c语言真题及答案,2007