这个管道程序没有编译

时间:2016-08-17 03:10:50

标签: c pipe

我正在学习OS课程。 我们被教过管道,这个程序没有在GCC 4.4.7中编译。当我们将main更改为int main时,它会很好地编译。是什么原因?

命令行:gcc pipedemo.c

#include<stdio.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>

#define BUFFER_SIZE 100
#define READ_END 0
#define WRITE_END 1

main()
{
        char source[]="pipe_program";
        char dest[BUFFER_SIZE];
        char datas[BUFFER_SIZE];
        char datar[BUFFER_SIZE];
        int fd1[2],fd2[2];
        pid_t pid;
        if(pipe(fd1)==-1)
        {
                fprintf(stderr,"Pipe creation failed\n");
                exit(0);
        }

       if(pipe(fd2)==-1)
       {
           //...
       }
       //...
 }

1 个答案:

答案 0 :(得分:2)

标准(ISO / IEC 9899-2011)说main

  

5.1.2.2.1程序启动

     

程序启动时调用的函数名为main。实施   宣布不   这个功能的原型。它应该使用返回类型int和no来定义     参数:

      int main(void) { /* ... */ }
     

或有两个参数(这里称为argc和argv,但可能有任何名称    使用,因为它们是声明它们的函数的本地函数):

      int main(int argc, char *argv[]) { /* ... */ }
     

或同等的;

这样就结束了吗? 不,不是那么容易。在引用的末尾是一个小分号,接下来就是这个看似无辜的小部分

  

或以其他一些实现定义的方式。

“托管”(操作系统及其规则中的第5.1.2.2节)与“独立”(第5.1.2.1节)之间存在差异。例如,对于小型PIC或类似产品,几乎没有任何规则和其余的是实现定义)

函数定义的语法在6.9.1节中定义,其中它读入项目1

  

在函数定义中声明的标识符(函数的名称)应具有函数类型,由函数定义的声明符部分指定。

第2项进一步详述

  

函数的返回类型应为void或者是数组类型以外的完整对象类型。

因此任何函数定义(包括main)都必须指定返回类型。

但是,看看上面或更好的“独立环境”的规则,缺乏它们。