我有这个linux程序,它使用管道将数据从父级传输到子级,并根据返回的值给出答案;
#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 readbuffer[80];
int log_variable;
char login[]="login";
void toLower(char str[]){//converts UPPERCASE to lowercase
int i;
for(i=0; i<strlen(str); i++)
str[i]=tolower(str[i]);
}
//end of toLower
int compareStrings(char str1[], char str2[]){//compares 2 strings
if(strlen(str1) == strlen(str2))
{
int i;
for( i=0; i<strlen(str1); i++){
if(str1[i] != str2[i])
return 0;
return 1;
}
}
else return 0;
}
int loginCommand(char argument[]){//test function so far for login, myfind etc
int fileDescr;
pipe(fd);//defines the pipe
switch(childpid=fork()){//switch statement to control parent and child
case -1:
perror("fork -1\n");
exit(0);
case 0://child
close (fd[1]);
char givenUsername[20];
//open the config file and copy the username from it, assign to a variable, and then
//compare it to readbuffer
int nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
if(strcmp(readbuffer, login) == 0){
printf("1: ");
return 1;
}
else {
printf("0: ");
return 0;
}
exit(0);
default:
//parent
close(fd[0]);
write(fd[1], argument, sizeof(argument));
wait(NULL)!=-1;
exit(0);
}
}
main(){
char input[20];
int logs;
while(logs == 0){
printf("Insert command: \n");
scanf("%s", input);
toLower(input);
logs=(loginCommand(input));
if(logs == 1) {printf("System accessed\n"); }
if(logs == 0) {printf("This username doesnt exist\n"); }
}
return 0;
}
但是我最大的问题是我输入了“login”的值,这与上面的登录变量相同,程序响应正确,但如果我将该变量更改为“loginloginlogin”值,那么就说了,如果我从控制台输入相同的值,程序会说该值不正确。我的假设是程序不会从控制台读取整个输入,但是我已经改变了字符串的大小,并且仍然具有相同的行为。
有谁知道最近发生了什么?
答案 0 :(得分:3)
问题在于:
write(fd[1], argument, sizeof(argument));
将数组传递给函数时,它会衰减到指向第一个字符的指针。在指针上执行sizeof
会给出指针的大小,而不是指向它的大小。
要获得字符串的长度,您需要使用strlen
。
哦,不要忘记使用strlen(argument) + 1
来发送字符串终结符(或者在子进程中终止字符串)。