Проблемы с процессом форкирования и вызовом bc с помощью execve - PullRequest
0 голосов
/ 27 июня 2019

моя программа предназначена для разветвления процесса, построчно считывая файл из строки в родительском и перетаскивая эти строки по каналу для передачи в bc, который вызывается с помощью execve.

Файл, который я использую, представляет собой текстовый файл, который просто содержит 5 + 10.

Родительский процесс читает их следующим образом:

while(fgets(newWord, sizeof newWord, coolFile) != NULL)
{
    write(stdin_pipe_fds[1], newWord, (strlen(newWord)+1));
}

Ребенок звонит до нашей эры так:

execve("/usr/bin/bc", argv, NULL);

При запуске программы выдается следующее сообщение об ошибке:

 scg3q@system64:~/CS/project4$ (standard_in) 1: syntax error
 (standard_in) 1: illegal character: ^@
 (standard_in) 1: syntax error

Это происходит, когда я пытаюсь выполнить bc. Есть идеи?

РЕДАКТИРОВАТЬ: проверка того, что нулевой терминатор не передается в bc через канал, исправляет одно сообщение об ошибке (недопустимый символ), но два других остаются. Надеюсь, у кого-то есть представление о проблеме, может быть!

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Не добавляйте 1 к strlen(newWord).Это приводит к записи нулевого терминатора в канал, но bc не ожидает нулевой байт на входе.

write(stdin_pipe_fds[1], newWord, (strlen(newWord)));

Чтобы исправить другую синтаксическую ошибку, убедитесь, что newWord заканчиваетсяс символом новой строки, потому что bc требует, чтобы его ввод был полными строками.

0 голосов
/ 27 июня 2019

При запуске программы выдается следующее сообщение об ошибке:

scg3q@system64:~/CS/project4$ (standard_in) 1: syntax error
(standard_in) 1: illegal character: ^@
(standard_in) 1: syntax error

Эти сообщения получены от bc.Они жалуются на то, что данные, которые вы вводите на его стандартный ввод, синтаксически неверны из-за недопустимого символа ^ @, который является нулевым ограничителем, который вы ошибочно осторожно отправляете по потоку.Это не часть прочитанного вами ввода, и его не следует отправлять на bc.

...