LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 960|回复: 2

gcc编译的问题

[复制链接]
发表于 2006-5-8 16:07:15 | 显示全部楼层 |阅读模式
以下程序测试非命名管道:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define error(x) {perror(x);exit(-1);}
int jump(command1,command2)
char *command1[],*command2[];
{
int pfd[2];
int pid;
//char *mesg;
//FILE *fp;
if(pipe(pfd)==-1)
        error("pipe");
if((pid=fork())==-1)
        error("fork");
else if(pid==0)
                {
                close(1);
                dup(pfd[1]);
                close(pfd[0]);
                close(pfd[1]);
                execvp(command1[0],command1);
                error("execvp 1");       
                }
   else
                {
                wait(NULL);
                close(0);
                dup(pfd[0]);
                close(pfd[0]);
    close(pfd[1]);
                execvp(command2[0],command2);
                error("execvp 2");
                }
}
main()
{
static char *command1[]={"ls","-al",(char *)0};
static char *command2[]={"sort"};
if(jump(command1,command2)!=0)
        {
        fprintf(stderr,"JumpPipe Error\n");
        exit(1);       
        }
exit(0);
}

    这个程序的作用是将当前日录下的文件按照文件的大小顺序排列打印出来。
将子进程的输出由原来的标准输出重定向到管道的写端口,并将父进程的输入从原来
的标准输人重定向到管道的读端口.
我用gcc-2.95.3-5编译无法通过,但将jump函数中的第一个else去掉后编译就通过了.
我也测试了下面的的这个程序,gcc-2.95.3-5是可以通过的
#include <stdio.h>
main()
{
  if(0)
    putchar('1');
  if(0)
    putchar('2');
  else if(0)
  {
    putchar('3');
    putchar('3');
  }
  else
  {
   putchar('4');
   putchar('4');
  }
  exit(0);
}
大家看看是什么问题
发表于 2006-5-8 20:20:00 | 显示全部楼层
你的那个error(x)的MACRO是大括号,你用时候还加了分号,显然是语法错误啊!
这个MACRO好危险,还是换成inline函数吧。
回复 支持 反对

使用道具 举报

发表于 2006-5-9 15:23:12 | 显示全部楼层
更多人喜欢类似下面这样的方式,在调用的时候要照写分号,而且在特殊情况下也不会出错

#define error(x) do{perror(x);exit(-1);}while(0)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表