2015-10-27 139 views
0

我想寫一個使用管道的Linux程序,但到目前爲止我遇到了一個主要問題。 當我嘗試運行它時,它似乎要麼複製答案,要麼根本不給我答案。 到目前爲止,我正在嘗試使用管道,父級從鍵盤獲取一個字符串,並將其與鍵盤上的字符串進行比較,以查看是否與任何其他命令相匹配,它只是「登錄」命令。 但它不起作用,因爲它不顯示我失敗或成功的消息。我一直在編寫代碼,但有時它會重複幾次,如同它正在執行孩子幾次。有人能解釋我爲什麼發生? THXLinux管道和重定向輸出

#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

一對夫婦的問題,爲你的代碼簡單瞭解一下:

  • 比較函數沒有返回值,如果長度不相等。
  • test()函數可能會在一個進程中調用兩次,這意味着fork多次。
  • 測試()內爲孩子將返回到主,也是家長將返回主...讓事情變得更加複雜在這裏(孩子可能叉第三次......)

使用「strace -F」可以讓你更好地瞭解背後發生了什麼。

+0

Thx,它的工作。但是現在我修改了我的main(),讓while語句在每次命令錯誤時都會循環,如果沒有,則會中斷,但是中斷不會發生:\。我將重新發布帖子 – Justplayit94

+0

第二個想法,我解決了它,我有while語句listem到日誌變量,直到它變爲1. – Justplayit94

+0

@ Justplayit94要小心。因爲fork(),有兩個副本的變量和相同的代碼來運行。你可能會看到一個程序,但仍然內部錯誤。同時,你的孩子可能會保留叉子.... –