Linux管道和重定向输出

时间:2015-10-27 00:52:41

标签: linux unix pipe parent

我正在尝试使用管道编写一个linux程序,但到目前为止我遇到了一个主要问题。 当我试图运行它时,它似乎要么重复答案,要么根本没有给我答案。 到目前为止,我正在尝试使用管道,父级从键盘获取一个字符串,并比较它以查看是否匹配任何其他命令,暂时只是“登录”命令。 但它不起作用,因为它没有向我显示失败或成功的消息。我一直在编写代码,但有时它会重复几次这样的答案,比如几次执行孩子。有人能解释我为什么会这样吗? THX

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>


int fd[2], nbytes;
pid_t childpid;
char input[12];
char readbuffer[80];
int log_variable;
int pid; 


int compare(char str1[], char str2[]){
if(strlen(str1) == strlen(str2))
{int i;
for( i=0; i<strlen(str1); i++){
if(str1[i] != str2[i])
return 0;
return 1;
}
}
}


int test(char argument[]){//test function
pipe(fd);

switch(childpid=fork()){

case -1:
perror("fork -1\n");
exit(1);


case 0://child
close (fd[1]);

int nbytes = read(fd[0], readbuffer, sizeof(readbuffer));


if(compare(readbuffer, "login") == 1){

return 1;
}

else if(compare(readbuffer, "login") == 0){
return 0;

}
exit(1);



default:
//parent
close(fd[0]);
write(fd[1], argument, sizeof(argument));
while(wait(NULL)!=-1);

}

}
main(){

while(1){
printf("Insert command: \n");
scanf("%s", input);

logs=(test(input));
if(logs == 1) {printf("success\n"); break;} 
else if(logs == 0) {printf("fail\n"); continue;}
}

return 0;
}

1 个答案:

答案 0 :(得分:1)

快速查看代码的几个问题:

  • 如果长度不相等,则比较函数不会返回值。
  • test()函数可能在一个进程中被调用两次,这意味着fork更多次。
  • test()内部为孩子将返回主,同时父母将返回主...这里的事情变得更复杂(孩子可能第三次分叉......)

使用&#34; strace -F&#34;可以让你更好地了解背后发生的事情。