管道读取处理

时间:2013-06-25 23:11:01

标签: linux pipe

我必须从用户那里获取输入,将其放入管道(在父进程中)然后我必须处理子进程中的字符串。所有大写字母都必须为小写,所有小写字母必须为大写。我的问题是管道的输出。我的代码只会改变字符串中第一个字符的字母大小写,我不知道为什么。子管道正在读取所有字符(至少看起来像是)。我希望有人可以告诉我为什么这不会处理每个角色。

while (read(pfd[0], &buf, strlen(cmd)) > 0){
    if(buf >= 'a' && buf <= 'z'){
        buf = toupper(buf);
    }
    else{
        buf = tolower(buf);
    }
}

write(STDOUT_FILENO, &buf, strlen(cmd));

1 个答案:

答案 0 :(得分:0)

你犯了两个常见的错误。

(1)read不会为您缓冲,因此您无法保证获得len个字节(例如,在您的情况下为.strlen(cmd)。)。 read将返回最多指定长度的任意数量的字节,但它可以并且通常会返回更少。所以你想改变你的阅读循环来反映这一点。

(2)buf可能是一个char数组。您总是更改第一个字节,只更改第一个字节。您需要迭代刚刚读取的所有字节。

所以把它们放在一起,比如

while ((bytesread = read(pfd[0], &buf, strlen(cmd))) > 0)
{
    for (int i = 0; i < bytesread; ++i)
    {
        if(buf[i] >= 'a' && buf[i] <= 'z')
            buf[i] = toupper(buf[i]);
        else
            buf[i] = tolower(buf[i]);              
    }

    write(STDOUT_FILENO, &buf, bytesread);
}