我编写了这个必须执行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的第二个参数。
答案 0 :(得分:1)
在开关中的每个案例后添加中断指令。
答案 1 :(得分:1)
请记住,子进程在fork
调用后直接开始执行代码,这意味着父进程和子进程都将调用scanf
。您需要在fork
电话后检查您是否在直接中处于子进程或父进程中。
您还需要在break
语句中的案例之间使用switch
语句,否则当您执行第一个案例时,它将继续,并且也会在第二个案例中继续。
还有一个问题是子进程永远不会退出,而是继续无限循环。完成子进程后,应该exit
。
您还创建了许多“已失效”的流程,因为您的子流程永远不会wait
。您需要调用wait
函数(或其中一个相关函数,如waitpid
)来“收割”孩子。否则,即使该过程处于暂停状态,该过程仍将存在。