linux execve,分段错误(strcmp_sse42) #包括 #包括 #包括 #包括 void main(){ int x,y,status,i; int-cnt=0; int标志=0; char-buf[50]; char-str[50]; char*argv[10]; char*ptr; 对于(i=0;i

linux execve,分段错误(strcmp_sse42) #包括 #包括 #包括 #包括 void main(){ int x,y,status,i; int-cnt=0; int标志=0; char-buf[50]; char-str[50]; char*argv[10]; char*ptr; 对于(i=0;i,c,linux,gdb,strcmp,execve,C,Linux,Gdb,Strcmp,Execve,如果输入&,变量argv[cnt-1]将设置为NULL,因此在If(!strcmp(argv[cnt-1],“exit”)中,函数strcmp的第一个参数将为NULL,这将使应用程序崩溃 此外,您的代码不会检查任何缓冲区溢出、索引越界……这段代码相当“危险” 这意味着: 您不应使用获取,请参阅 检查argv(注意:此变量名可能不是一个好的变量名,argv通常是程序本身的参数)数组在插入元素时是否足够大 @JongSeokKim我改进了我的答案,如果我的答案确实解决了您的问题,请验证它。OT:不

如果输入
&
,变量
argv[cnt-1]
将设置为NULL,因此在
If(!strcmp(argv[cnt-1],“exit”)
中,函数
strcmp
的第一个参数将为NULL,这将使应用程序崩溃

此外,您的代码不会检查任何缓冲区溢出、索引越界……这段代码相当“危险”

这意味着:

  • 您不应使用
    获取
    ,请参阅
  • 检查
    argv
    (注意:此变量名可能不是一个好的变量名,argv通常是程序本身的参数)数组在插入元素时是否足够大

@JongSeokKim我改进了我的答案,如果我的答案确实解决了您的问题,请验证它。OT:不要使用
get(buf)
!而是使用
fgets(buf,50,stdin)
。不管visual studio允许什么,来自
main()
的唯一有效返回类型是
int
,而不是
void
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

void main(){
   int x,y,status, i;
   int cnt = 0;
   int flag = 0;
   char buf[50];
   char str[50];
   char * argv[10];
   char * ptr;


   for(i=0; i<10; i++){
    printf("$");
    gets(buf);
    strcpy(str, buf);

    ptr = strtok(buf, " ");

    while(ptr != NULL){
      argv[cnt] = ptr;
      cnt++;
      ptr = strtok(NULL," ");
    }



    if(!strcmp(argv[cnt-1], "&")) {
      argv[cnt-1] = 0;
      flag = 1;
    }
    else {
        argv[cnt] = 0;
    }



    if(!strcmp(argv[cnt-1], "exit")) exit(0); 

    x=fork();

    if (x==0){
        sleep(1);
        printf("I am child to execute %s\n", str);
        y=execve(argv[0], argv, 0);

        if (y<0){
           perror("exec failed");
           exit(1);
        }

    }
    else {
      if(flag == 0) { 
          wait(&status); 
      }
    }


    flag = 0;
    cnt = 0;
   }
}