Linux管道坏行为

时间:2015-10-27 09:08:05

标签: c linux input pipe

我有这个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”值,那么就说了,如果我从控制台输入相同的值,程序会说该值不正确。我的假设是程序不会从控制台读取整个输入,但是我已经改变了字符串的大小,并且仍然具有相同的行为。

有谁知道最近发生了什么?

1 个答案:

答案 0 :(得分:3)

问题在于:

write(fd[1], argument, sizeof(argument));

将数组传递给函数时,它会衰减到指向第一个字符的指针。在指针上执行sizeof会给出指针的大小,而不是指向它的大小。

要获得字符串的长度,您需要使用strlen

哦,不要忘记使用strlen(argument) + 1来发送字符串终结符(或者在子进程中终止字符串)。