Проблемы с процессом разветвления и вызовом bc с помощью execve

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

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

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

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

Ребенок вызывает bc следующим образом:

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 через канал, исправляет одно сообщение об ошибке (недопустимый символ), но два других остаются. Надеясь, что у кого-то есть идея проблемы может быть!


person OldIslander    schedule 27.06.2019    source источник


Ответы (2)


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

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

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

person Barmar    schedule 27.06.2019
comment
Что ж, сообщение о недопустимом символе убрано, а два других остались. - person OldIslander; 27.06.2019
comment
У вас есть новая строка в конце newWord? bc требует, чтобы ввод заканчивался новой строкой. - person Barmar; 27.06.2019

Запуск программы дает мне это сообщение об ошибке:

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

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

person John Bollinger    schedule 27.06.2019
comment
Да, спасибо, убедитесь, что нулевой терминатор не отправлен по каналу, исправит сообщение о недопустимом символе, но два других останутся. Любые идеи? - person OldIslander; 27.06.2019
comment
@OldIslander, ничто другое, представленное в вопросе, не объясняет какие-либо ошибки, но подозрительно, что вы передаете вектор аргумента программы (argv) в bc как свой собственный. В качестве альтернативы проблема может заключаться во входном файле, поэтому попробуйте передать его непосредственно в bc с помощью команды, похожей на bc <my_input_file. - person John Bollinger; 27.06.2019