Linux中C程序的i / o重定向编译错误

时间:2015-04-22 19:30:44

标签: c linux system-calls

我正在尝试进行简单的I / O重定向(ls进行排序)(ls | sort> f1)然后我的下一步是将sort的输出定向到C中的文件,但是当编译gcc时给出以下错误..plz帮助我:)

代码

#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int a,b,c,d,pfd[2],kk,i,j;
FILE *fp;

i=fork();
if(i==0)
{
    pipe(pfd);
    j=fork();
    if(j==0)
    {
        close(1);
        dup(pfd[1]);
        close(pfd[0]);
        close(pfd[1]);
        excel("/bin/ls","/ls",0);
    }
    else
    {
        close(0);
        dup(pfd[0]);
        close(pfd[0]);
        close(pfd[1]);
        /*close(1);
        kk=open(f.txt,O_WRONLY);
        dup(kk);
        */
        excel("/usr/bin/sort","/sort",0);
    }
}
else
    wait();
/*char k[100],pp[100],ll[]="/bin/";
printf("Enter the cmd to execut");
scanf("%s",k);
strcpy(pp,k);
strcat(ll,k);
printf("%s",ll);
system(ll);*/
    return 0;
}

错误:

  

/tmp/cc6wIvoJ.o:

In function **main**:
j.c:(.text+0x81): undefined reference to **excel**

j.c:(.text+0xcf): undefined reference to **excel**

collect2: error: ld returned 1 exit status

3 个答案:

答案 0 :(得分:1)

这里有一些虚假的答案我无法发表评论,因为我没有“50点声望”。因此,这是一个全新的回复。

正如人们正确指出的那样,你显然有拼写错误,你需要 execl 而不是 excel

然而,人们声称execl是一个系统调用。它不是。这是libc中的一个便利功能。在一天结束时执行的Syscall是execve,您可以通过例如使用strace。

您的代码有几个问题,编译时是否启用了警告? -Wall -Wextra to gcc肯定会有所帮助。

示例问题: - wait()接受一个参数,如果只包含正确的头文件,你会收到警告 - 缺少错误检查(fork,pipe,wait)

一般来说,您的编码风格会让您遇到麻烦。

始终包含相关标头(可在联机帮助页中找到)并检查返回值。

答案 1 :(得分:0)

没有名为excel的系统调用。因此,你得到了未定义的错误。尝试使用像execl这样的exec()系列调用之一。 -

  

http://linux.die.net/man/3/execl

答案 2 :(得分:0)

它的执行力不高。 execl是你正在寻找的电话。