我正在尝试进行简单的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
答案 0 :(得分:1)
这里有一些虚假的答案我无法发表评论,因为我没有“50点声望”。因此,这是一个全新的回复。
正如人们正确指出的那样,你显然有拼写错误,你需要 execl 而不是 excel 。
然而,人们声称execl是一个系统调用。它不是。这是libc中的一个便利功能。在一天结束时执行的Syscall是execve,您可以通过例如使用strace。
您的代码有几个问题,编译时是否启用了警告? -Wall -Wextra to gcc肯定会有所帮助。
示例问题: - wait()接受一个参数,如果只包含正确的头文件,你会收到警告 - 缺少错误检查(fork,pipe,wait)
一般来说,您的编码风格会让您遇到麻烦。
始终包含相关标头(可在联机帮助页中找到)并检查返回值。
答案 1 :(得分:0)
没有名为excel
的系统调用。因此,你得到了未定义的错误。尝试使用像execl这样的exec()
系列调用之一。 -
答案 2 :(得分:0)
它的执行力不高。 execl是你正在寻找的电话。