我正在尝试模拟cat中的Red Hat Linux命令。我运行程序时得到segmentation fault。
例如:
./a.out a > b
a
包含你好。我希望你能在b
中复制你好。
我的代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char *argv[])
{
int f, fd, r;
char buf[100];
if (argc < 2)
{
printf("Error");
return 0;
}
else
{
if (!strcmp(argv[2],">"))
{
f = open(argv[1],0,00777);
if (f == -1)
printf("no file");
else
{
fd = creat(argv[3],00777);
while( (r = read(f,buf,50)) > 0)
write(fd, buf, r);
}
}
}
return 0;
}
为什么我会收到分段错误?
我有一个类似的程序,我打开并以相同的方式创建文件,该程序正在运行,但这个给了我一个分段错误。
答案 0 :(得分:6)
这可能是因为重定向是由shell而不是您的程序处理的,因此argv[2]
NULL
并且argv[3]
不存在。
但是你应该使用调试器来找出真正发生的事情。然后添加适当的错误检查。
答案 1 :(得分:4)
你可以在没有gdb
的情况下生活 - 但你必须以结构化的方式开始解决问题:
不要取任何理所当然的事。例如,即使你将你的程序称为program > file
,也不要认为argv
看起来像你想象的那样,而是通过输出它们来检查它:
printf("argc: %d\n", argc);
printf("argv[0]: %s\n", argv[0]);
printf("argv[1]: %s\n", argv[1]);
printf("argv[2]: %s\n", argv[2]);
printf("argv[3]: %s\n", argv[3]);
// the se can be expressed better with a for loop - but I'll leave that as an exercise for you
只会认定您已验证的内容:如果您知道argc >= 2
,则不要访问argv[2]
和/或argv[3]
。
不要说
if(argc<2)
{
printf("Error");
return 0;
}
但
if(argc<2) // according to the point before, better y3 or <4
{
printf("Too few command line arguments");
return 1; // not 0; 0 would mean success
}
答案 2 :(得分:1)
Joachim Pileborg的答案显然是正确的,只是尝试以
运行您的程序./a.out a \> b
防止shell解释“&gt;”作为重定向。