【问题标题】:Beginner Programming SO with System Call使用系统调用的初学者编程 SO
【发布时间】:2015-04-03 15:26:48
【问题描述】:

我必须将两个数字相加,而第一个数字不等于 -1,并且这些数字只有一个数字。 我必须使用 read() 和 write()。

#include <unistd.h>
#include <errno.h>

int main()
{   int Somma;
    int One;
    int Two;

    do
    {   write(1, "\nFirst Number: ", 15);
        if(read(0, &One, sizeof(int)) == -1)
            perror("Error First Read");

        if(One != -1)
        {   write(1, "Second Number: ", 15);
            if(read(0, &Two, sizeof(int)) == -1)
                perror("Error Second Read");

            Somma = One + Two;
            Somma -= 48;

            write(1, "Sum: ", 5);
            if(write(1, &Somma, sizeof(int)) == -1)
                perror("Error Write");
        }

    }while(One != -1);

    return 0;
}

现在,我有一些问题。首先,当 One 等于 -1 时,程序继续进入 if 语句...... 第二个是最后一个write(),打印出数字和一个奇怪的字符(一个带有0014代码的方块变成...)。 怎么了?

提前谢谢你

【问题讨论】:

  • 你有什么理由不使用像 printf(3) 和 scanf(3) 这样的 glibc 函数吗?您使用 read(2) 错误,读取 4 个字节,等于 4 个字符。 read(2) 读取二进制数据,而不是实际字符。
  • 教授说我们必须在unistd.h库中使用read()和write()...
  • 哦,好的。除了下面的答案之外,我想说的是,由于您正在使用 linux,请尽量不要将变量名中的第一个字母大写。另一件事是,在read(2)write(2) 调用中使用STDIN_FILENO 代替0 和STDOUT_FILENO 代替1。它会更容易阅读。
  • 你应该通过标准输入读取数字吗?
  • 在这个练习中,我必须通过标准输入读取...在下一个我将不得不从输入文件中读取...

标签: c system call


【解决方案1】:

我猜你是在 Linux 或一些 POSIX 系统上。

read(2)write(2) 系统调用正在读取字节。在现代 Linux 系统上,终端通常使用 UTF-8 编码字符串(如果必须,您可以使用 libunistring 处理)。出于效率原因,您应该(手动)缓冲 I/O,即尝试以几千字节(通常为 16 字节)的块的形式读取或写入。

您显然应该处理字节数(由这些系统调用返回)。不要忘记处理错误情况(例如,使用perror(3) 然后exit(EXIT_FAILURE); 显示它们)

您的代码是错误的,因为 sizeof(int) 通常是 4,而您对 read 的调用可能只读取 1,2 或 3 个字节(但通常会读取 4 个字节)。您必须处理缓冲,这是练习的一部分。

您可以使用sscanf(3)snprintf(3) 将字符串转换为int 并向后转换。不要忘记错误案例。

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2011-02-08
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2011-01-26
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多