与checksum的发送方和接收方有问题。在这里,我使用结构来定义要写入管道的变量。

struct ANSWER
{
    int arr[BUFFER];
    int counter;
    int ans;
}a;

用于checksum的机制是:
int chck(int value[],int count)
{
    int i,sum=0,checksum;
    for ( i=0; i<count; i++)
    {
        sum+=value[i];
    }
    printf("SUM IS :%d \n",sum);
    checksum=checksum^sum;
    printf("CHECKSUM IS : %d",checksum);
    return checksum;
}

主要问题是在管道中写入
write(pipe,a,sizeof(a));

这将使用struct写入所有包含。
在接收端检索特定值时出现问题
当我检索接收端的值时,会在count和ans变量中得到错误的值。
read(pipe,a,sizeof(a));
printf("COUNT : \n ",a.counter);

结果发现这些值是乱七八糟的。
主要区域:
void main(int argc, char * argv[])
{
    int pipe,i;

    pipe = open("devil",O_WRONLY);

    if ( pipe == -1 )
    {
        printf("ERROR NO PIPE FOUND \n");
    }

    printf("ENTER NUMBER OF ELEMENT : ");
    scanf("%d",a.counter);

    for ( i=0; i<a.counter; i++)
    {
        printf("ENTER NUMBER :");
        scanf("%d",&a.arr[i]);
    }

    a.ans=chck(a.arr,a.counter);

    printf("CHECKSUM IS : %d \n",a.ans);

    write(pipe,&a,sizeof(a));

}

最佳答案

我建议您将错误检查添加到所有系统和标准库调用(打印到stdout/stderr除外,这比几乎任何应用程序都要复杂),比如:

int main(int argc, char * argv[])
{
    int pipe, i;

    pipe = open("devil",O_WRONLY);
    if ( pipe == -1 )
    {
        perror("open pipe");
        return EXIT_FAILURE;
    }

    printf("ENTER NUMBER OF ELEMENT : ");
    if (scanf("%d",&a.counter) != 1)
    {
        fprintf(stderr, "scanf count IO or parse error, or EOF\n");
        return EXIT_FAILURE;
    }

    for ( i=0; i<a.counter; i++)
    {
        printf("ENTER NUMBER :");
        if (scanf("%d",&a.arr[i]) != 1)
        {
            fprintf(stderr, "scanf number IO or parse error, or EOF\n");
            return EXIT_FAILURE;
        }
    }

    a.ans=chck(a.arr,a.counter);
    printf("CHECKSUM IS : %d \n",a.ans);
    i = write(pipe,&a,sizeof(a));
    if (i == -1)
    {
        perror("write to pipe");
        return EXIT_FAILURE;
    }
    else if (i != sizeof(a))
    {
        fprintf(stderr, "write to pipe, partial write!\n");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

注意:对于迂腐的代码,write实际上返回类型ssize_t。根据标准的要求,我将main的返回类型更改为int。请阅读perror的手册页/文档,了解它的功能和如何打印实际错误消息。EXIT_FAILURE和是两个标准定义的返回值或退出代码的常量,通常分别为1和0。在一个更大的程序中,您可能会编写用于错误处理的帮助函数或宏,并将整个主函数拆分为多个函数,以使代码看起来不那么混乱。
另外,在EXIT_SUCCESS函数中使用未初始化的checksum变量。您可能应该将其初始化为0,如下所示:
int chck(int value[],int count)
{
    int i = 0, sum = 0, checksum = 0;
    ....

一般来说,您应该避免使用未初始化的变量,在第一次使用它们时很容易忘记,如这里所示。。。另外,打开编译器警告,这样,如果仍然意外地这样做,通常会收到警告。
还有一个错误:第一次扫描丢失了chck以获取指向&的指针(需要a.counter才能实际修改原始变量)。一个好的编译器也可能足够聪明,能够警告将可疑参数传递给scanf。

10-08 04:12