使用系统调用初学者编程SO

时间:2015-04-03 15:26:48

标签: c system call

我必须将两个数字相加,而第一个数字不等于-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代码的正方形...)。 怎么了?

提前谢谢

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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