execvp - обработка аргумента с экранированными пробелами

Делаю базовую оболочку, работает нормально, но есть одна проблема. В настоящее время, если я предоставляю аргументы, такие как

cat testtextfile

команда execvp работает нормально. Однако, если я предоставлю что-то вроде

cat hello\ world

т.е. файл с пробелом в имени, команда не сработает. Как заставить execvp понимать аргументы такого рода.

Ниже приведен фрагмент моего кода, который работает, если я изменю args3[1] на что-то вроде «-n»:

char *args3[3];

args3[0] = "cat";
args3[1] = "hello\\ world";
args3[2] = NULL;

if ((child = fork()) == 0) { //child
    printf("pid of child = %ld\n", (long) getpid());
    execvp(args3[0], args3); //arg[0] is the command

    fprintf(stderr, "execvp failed \n");
    exit(1);
} else { //parent

    if (child == (pid_t)(-1)) {
        fprintf(stderr, "fork failed.\n"); exit(1);
    } else {

        if (doNotWait == 0){
            c = wait(&cstatus); //wait for child
            printf("child %ld exited with status = %d\n",
            (long) c, cstatus);
        } else {
            printf("not waiting for child process\n");
        }
    }

}
return 0;

person timeshift117    schedule 08.04.2014    source источник
comment
Вам нужно предоставить код. Execvp должен быть полностью безопасным для такого типа вещей, так что есть вероятность, что это проблема в вашем вызывающем коде.   -  person DrC    schedule 08.04.2014


Ответы (1)


args3[1] = "hello\\ world";

должно быть

args3[1] = "hello world";

В команде cat hello\ world вам нужно избежать пробела между «hello» и «word», потому что вы не хотите, чтобы оболочка рассматривала «hello world» как два слова, поэтому после того, как оболочка правильно обработает аргументы командной строки, первый аргумент cat должно быть hello world, а не hello\ world.

person Lee Duhem    schedule 08.04.2014