出力をリダイレクトしようとしていますが、2 つの問題があります。問題 1: ls -l > file は正常に動作しますが、cat file1 > file2 を実行すると、シェルがバックグラウンドで無期限に動作しているように見えます。2〜3分待ってから中断する必要があります(Ctrl-D)。問題 2: ソート < 果物を使用する場合と同じ問題です。私のシェルはプロセスが終了するのを待っているようですが、決して終了しません。だから中断せざるを得ない。私は何か正しいことをしていないことを知っていますが、何が間違っている/欠けているのか理解できないようです. パイプはまだ実装していません。あなたの助けに感謝します。
int create_childprocess(char *argv[], int argc)
{
//int pid;
int fd, i, ret;
pid_t pid;
int redirect_sign =0;
if((pid = fork()) == -1)
{
/*error exit -fork failed*/
perror("Fork failed");
exit(-1);
}
if(pid == 0)
{
/*this is the child*/
printf("\nThis is the child ready to execute: %s\n", argv[0]);
for(i=0; i<argc; i++)
{
if((strcmp(">", argv[i])) ==0)
redirect_sign=1;
else if((strcmp(">>", argv[i])) ==0)
redirect_sign=2;
else if((strcmp("<", argv[i])) ==0)
redirect_sign=3;
else if((strcmp("<<", argv[i])) ==0)
redirect_sign=4;
}
if (redirect_sign==1) //if ">" is found...
{
fd = open(argv[argc-1],O_TRUNC | O_WRONLY | O_CREAT, 0755);
if(fd == -1)
{
/*An error occured. Print an error message and bail.*/
perror("open");
exit(-1);
}
else
{
printf("Writing output of the command %s to file created\n", argv[0]);
dup2(fd,1);
execlp(argv[0], argv[0], NULL);
close(fd);
}
}
else if (redirect_sign==2) //if ">>" was found...
{
fd = open(argv[argc-1], O_WRONLY | O_APPEND | O_CREAT, 0755);
if(fd == -1)
{
/*An error occured. Print an error message and bail.*/
perror("open");
exit(-1);
}
else
{
printf("Appending output of the command %s to file created\n", argv[0]);
dup2(fd,1);
execlp(argv[0], argv[0], NULL);
close(fd);
}
}
else if (redirect_sign==3) //if "<" was found...
{
fd = open(argv[argc-1], O_TRUNC | O_WRONLY | O_CREAT, 0755);
if(fd == -1)
{
/*An error occured. Print an error message and bail.*/
perror("open");
exit(-1);
}
else
{
printf("Writing content of file %s to disk\n", argv[argc-1]);
dup2(fd,1);
execlp(argv[0], argv[0], NULL);
close(fd);
}
}
else if (redirect_sign==4) //if "<" was found...
{
fd = open(argv[argc-1], O_TRUNC | O_WRONLY | O_CREAT, 0755);
if(fd == -1)
{
/*An error occured. Print an error message and bail.*/
perror("open");
exit(-1);
}
else
{
printf("Writing content of file %s to %s \n", argv[argc-1], argv[0] );
dup2(fd,1);
execlp(argv[0], argv[0], NULL);
close(fd);
}
}
else //if ">" or ">>" or "<" or "<<" was not found
{
execvp(argv[0], &argv[0]);
/*error exit - exec returned*/
perror("Exec returned");
exit(-1);
}
}
else
{
/*this is the parent -- wait for child to terminate*/
wait(pid,0,0);
printf("\nThe parent is exiting now\n");
}
free (argv);
return 0;
}