我编写这个程序,它必须执行mkdir和rmdir,父级必须向子级发送参数,子级执行它。
void main()
{
int r;
int i;
int fd[2];
pipe(fd);
char arg[100];
printf("Please Choose one of the following commands: n");
printf("1 MKDIR n");
printf("2 RMDIR n");
while(1)
{
printf("You choose: n");
scanf("%d ", &r);
pid_t pid;
pid = fork();
printf("Please enter arguments: ");
scanf("%s ", arg);
write(fd[1],arg,sizeof(arg));
for(i=0;i<4;i++)
{
if(pid==0)
{
switch(r)
{
case 1:
read(fd[0],arg,sizeof(arg));
execl("/bin/mkdir", "MKDIR", arg, NULL);
case 2:
read(fd[0],arg,sizeof(arg));
execl("/bin/rmdir", "RMDIR", arg, NULL);
}
}
break;
}
}
}
问题是当我执行它时,我需要扫描 r 两次,然后它重复请输入参数两次,它执行 r 的第二个参数。
在开关中的每种情况之后添加中断指令。
请记住,子进程在fork
调用后直接开始执行代码,这意味着父进程和子进程都将调用scanf
。您需要在fork
调用后直接检查您是在子进程还是父进程中。
您还需要在switch
语句中的案例之间有一个break
语句,否则当您执行第一种情况时,它将继续下去,并且也会持续到第二个情况。
还有一个问题是子进程永远不会退出,而是继续无限循环。子进程完成后,它应该exit
。
还创建了许多"已失效"的流程,因为您永远不会为子流程wait
。你需要调用wait
函数(或其相关函数之一,如waitpid
)来"收获"孩子。否则,即使进程处于暂停状态,该过程仍将存在。