我一直在尝试在Linux中实现一个shell作为学习经验...更改目录功能和程序本身在不同的权限下提供不同的输出。
1)在正常用户权限下执行
[Vivek-lappy]/home/Vivek-lappy/Documents/Zeus/Zeus>ls /
0 dev initrd.img live-build mnt root srv usr
bin etc lib lost+found opt run sys var
boot home lib64 media proc sbin tmp vmlinuz
[Vivek-lappy]/home/Vivek-lappy/Documents/Zeus/Zeus>cd /
PWD=/
[Vivek-lappy]/>ls
Segmentation fault
gdb显示以下错误:
Program received signal SIGSEGV, Segmentation fault.
_IO_vfprintf_internal (s=0x0, format=0x402953 "command:%s\n",
ap=ap@entry=0x7fffffffdd08) at vfprintf.c:1278
1278 vfprintf.c: No such file or directory.
2)在sudo权限下执行
[root](null)>ls /
0 dev initrd.img live-build mnt root srv usr
bin etc lib lost+found opt run sys var
boot home lib64 media proc sbin tmp vmlinuz
[root](null)>cd /
PWD=/
[root]/>ls
0 dev initrd.img live-build mnt root srv usr
bin etc lib lost+found opt run sys var
boot home lib64 media proc sbin tmp vmlinuz
[root]/>
3)其他信息 变更目录功能代码
void add(char * name,char * value){
unsetenv(name);setenv(name,value,1);
}
void dump(char * name){
char * value=getenv(name);
printf("%s=%s\n",name,value);
}
int cd(char * argv[],int argc){
char cwd[1024];
if(argc>2){
printf("\n Too many arguments cd accepts only one argument that is the directory name\n");
return -1;
}
if(argv[1]==NULL){
if(chdir(getenv("HOME"))==0){
add("PWD",getenv("HOME"));
dump("PWD");
return 0;
}
}
if(chdir(argv[1])!=0){
printf("\n No Such Directory\n");
printf("\nUSAGE:> cd Dir_name [Where Directory_Name is the Directory name] \n");
return -1;
}
if (!getcwd (cwd, sizeof(cwd))) {
perror ("getcwd");
exit (EXIT_FAILURE);
}
else{
add("PWD",cwd);
dump("PWD");
}
return 0;
}
执行代码:
int execute(char * argv[],int argc){
int status;
if(strcmp(argv[0],"cd")==0){
cd(argv,argc);
}
else if(strcmp(argv[0],"list")==0){
list();
}
else if(strcmp(argv[0],"color")==0){
color();
}
else if(strcmp(argv[0],"history")==0){
history();
}
else
{
pid_t pid=fork();
if(pid<0){
fprintf(stderr, "cant fork process%s\n",strerror(errno) );
return 1;
}
else if(pid==0){
if(execvp(argv[0],argv)<0){
fprintf(stderr, "cant run program:%s\n",strerror(errno) );
return 1;
}
}
else
{
while(wait(&status)!=pid)
;
}
}
return 0;
}
为什么同一程序的输出因不同的权限而不同?
答案 0 :(得分:0)
您的分段错误很可能是因为使用了指向某些未初始化或随机数据的指针。根据此类随机数据的内容,您可能会遇到分段错误,或者数据似乎足以使您的程序继续执行。不同的情况(如sudo与否)可能会在随机或未初始化的数据中提供不同的内容。
为了进一步调试,我会调整你的限制,以便生成核心转储文件。通过该核心转储,您将能够在调试器中准确地看到程序段错误的位置。您可能已经这样做了,因为您知道segfault在函数vprintf中,您自己没有编写,但如果您在调用堆栈中看起来更高,您可能会发现自己的代码调用某些* printf函数不好的论点。