我寫我自己的殼了家庭作業,和我遇到了這個問題:錯誤的文件描述符問題殼
每當我輸入一個命令的輸出重定向到一個文件(即LS -al>輸出.txt)我的shell應該處理命令並重定向輸出。不過,我不斷收到此消息顯示:ls: write error: Bad file descriptor
我在其他幾個論壇上,這可能是在參考超出的內存量看見了,但我不明白怎麼會是問題。這裏有一點我的代碼(如果你需要更多的透明度,隨時問):
loc[0] = argv[0]; //used for execution
while(argv[count] != 0){ //loop through commands
if(strcmp(argv[count], "<") == 0) //and test for certain flags
inFlag = 1;
else if(strcmp(argv[count], ">") == 0){
argv[count] = argv[count+1] = 0;
outFlag = 1;
}
else if(strcmp(argv[count], "&") == 0)
bgFlag == 1;
else if(strcmp(argv[count], "|") == 0){
argv[count] = 0;
loc[pipes+1] = argv[count+1];
pipes++;
}
count++;
}
for(k = 0; k <= pipes; k++){
if(j < pipes){
pipe(r_tube);
j++;
}
pid = fork();
if(pid > 0){
if(j > 0){
close(l_tube[0]);
close(l_tube[1]);
}
l_tube[0] = r_tube[0];
l_tube[1] = r_tube[1];
}
else if(pid == 0){
if((k == 0) && (inFlag == 1)){
int n = open("input.txt", "r");
close (0);
dup (n);
close (n);
}
else if((k > 0) && (k < pipes)){
}
else if((k == pipes) && (outFlag == 1)){ //<-----issue
int out = open("output.txt", 0666);
close (1);
dup (out);
close (out);
}
else if(k == pipes){
}
execvp(argv[loc[k]], &argv[loc[k]]);
所以更多...,事實證明,我居然無法打開文件(它返回printf語句)。有沒有辦法來解決這個問題?它可以在我的權限(0666)? – Baelix
在我的目錄下,文件「output.txt中」已經存在(在同一目錄這個shell程序)。我將如何設置密碼寫入權限? – Baelix
這些變化解決了這個問題,但現在正在引發另一個問題。如果您在我的代碼中注意到,在看到「>」存在之後,我將「>」和輸出文件名都設置爲NULL。我收到此錯誤,這我現在再次接收:LS:不能訪問>:沒有這樣的文件或目錄 – Baelix