Так что в основном я пишу программу, которая многократно считывает строки ввода со стандартного ввода, разделяет их в массиве char **. Для каждой строки обрабатывайте первый элемент как полный путь к исполняемой программе. Выполните программу, передав остальную часть элементов в строке в качестве аргументов. Если строка пуста, ничего не делайте и переходите к следующей строке. Повторяйте, пока первый элемент не будет содержать строку «exit».функции fork() и exec() в C
Мои проблемы:
- когда вход "выход", то зЬгстр (л [0], "выход") возвращает 10 вместо 0. Почему?
- Программа была скомпилирована, но работает только для нечетного числа аргументов. Например, если я вводил «/ bin/echo This is good», он печатает «Это хорошо» Но если я ввожу «/ bin/echo Это очень хорошо», он печатает «error».
Вот мой код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFSIZE 10000
int space;
char** createArray(char *line) {
int len_line = strlen(line);
char **wordArray = NULL;
if(len_line > 1){
char *token = strtok(line, " ");
space = 0;
while (token) {
wordArray = realloc(wordArray, sizeof(char*)*++space);
wordArray[space-1] = token;
token = strtok(NULL, " ");
}
}
return wordArray;
}
int main(int argc, const char* argv[]) {
char line[BUFSIZE];
while (1) {
printf("%s\n", ">");
fgets(line, BUFSIZE, stdin);
char** l = createArray(line);
if (l) {
/*why instaed of zero, when l[0]
/*equals quit, strcmp() returns 10?*/
printf("%d\n", strcmp(l[0], "exit"));
if(strcmp(l[0], "exit")==10) {
exit(0);
}
else if(fork() == 0) {
execv(l[0], l);
printf("%s\n", "Error!");
}
}
}
return 1;
}
'if (strcmp (l [0]," exit ") == 10)' ... или вы имели в виду 'if (strcmp (l [0]," exit ") == 0)'? –
Ожидание 'strcmp()' для возврата ровно 10 довольно странно. Он возвращает либо ноль, либо положительное число (возможно, 10), либо отрицательное число. – sharptooth
Вы действительно должны скомпилировать все предупреждения и информацию об отладке (например, 'gcc -Wall -Wextra -g'), тогда ** использовать отладчик ** (' gdb') –