2
因此,我正在寫一個簡單的外殼在C,可以做標準輸入重定向。我正在從用戶那裏讀取一個字符串,將它拆分爲參數,然後將其提供給exec。但是,當我將輸出重定向到第一個時:創建我請求的文件並使用正確的數據填充它,然後將命令結果無限打印在終端中。我在用dup2做錯了什麼?外殼重定向導致無限打印到終端
這是我的重定向代碼。所有使用的變量都是全局變量,除了文件描述符。
int execRedirectCommand(){
int fd;
pid_t pid = fork();
// fork failed
if(pid == -1){
char* error = strerror(errno);
printf("fork: %s\n", error);
return -1;
}
//Child process
else if(pid == 0){
fd = open(fileName, O_WRONLY | O_CREAT | O_TRUNC, 0755);
if(fd == -1){
char* error = strerror(errno);
printf("open:%s\n", error);
return -1;
}
dup2(fd, STDOUT_FILENO);
close(fd);
execvp(payloadArgv[0], payloadArgv);
// execvp failed
char* error = strerror(errno);
printf("pdsh:%s:%s\n", payloadArgv[0], error);
return -1;
}
// Parent process
else{
close(fd);
fileName = NULL;
// Wait for child process to finish
int childStatus;
waitpid(pid, &childStatus, 0);
return 0;
}
}
編輯固定的代碼沒有大的一個錯字。 EDIT 2包括我的主:
int main(){
setSigHandler();
char* user = getlogin();
while(1){
printf("[%s]-->$", user);
getNextCommand(payload);
if(!strcmp(payload, "\n")) continue;
if(!strcmp(payload, "close")) break;
parseCommandString();
if(fileName != NULL){
execRedirectCommand();
}else{
execSimpleCommand();
}
}
return 0; }
注:無標準輸出重定向的工作就好了命令。
也許問題是與colde調用此函數?我唯一能發現的地方就是錯誤的是,你正在從未打開/初始化過的parend進程中關閉'fd'。 – mata
@mata因爲我分叉不父母也獲得該文件的副本?編輯:添加我的主。 – Akaitenshi
@meta似乎確實解決了這個問題,但我的問題仍然存在:父母是否也獲得了該文件的副本? – Akaitenshi