Linux 管道和重定向输出
Linux Pipes and Redirecting output
我正在尝试使用管道编写 linux 程序,但到目前为止我遇到了一个主要问题。
当我尝试 运行 这个时,它似乎要么重复答案,要么根本不给我答案。
到目前为止,我正在尝试使用管道,parent 从键盘获取一个字符串,并比较它以查看是否匹配任何其他命令,目前它只是 "login" 命令。
但它不起作用,因为它没有向我显示失败或成功消息。我一直在摆弄代码,但有时它会多次重复答案,就像它多次执行 child 一样。有人能解释一下为什么会这样吗?
感谢
#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;
}
快速浏览一下您的代码的几个问题:
- 如果长度不相等,比较函数不会 return 值。
- test() 函数在一个进程中可能会被调用两次,这意味着要 fork 多次。
- child 内部的 test() 将 return 到主,parent 将 return 到主...让事情变得更复杂( child 可能会第三次分叉 ...)
使用"strace -F"可以让您更好地了解背后发生的事情。
我正在尝试使用管道编写 linux 程序,但到目前为止我遇到了一个主要问题。 当我尝试 运行 这个时,它似乎要么重复答案,要么根本不给我答案。 到目前为止,我正在尝试使用管道,parent 从键盘获取一个字符串,并比较它以查看是否匹配任何其他命令,目前它只是 "login" 命令。 但它不起作用,因为它没有向我显示失败或成功消息。我一直在摆弄代码,但有时它会多次重复答案,就像它多次执行 child 一样。有人能解释一下为什么会这样吗? 感谢
#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;
}
快速浏览一下您的代码的几个问题:
- 如果长度不相等,比较函数不会 return 值。
- test() 函数在一个进程中可能会被调用两次,这意味着要 fork 多次。
- child 内部的 test() 将 return 到主,parent 将 return 到主...让事情变得更复杂( child 可能会第三次分叉 ...)
使用"strace -F"可以让您更好地了解背后发生的事情。