Почему я не могу передать в файл output.txt или grep -v? - PullRequest
0 голосов
/ 11 июня 2019

Мне нужно иметь возможность просматривать результаты этой команды. Это работает нормально, если я оставлю это после «готово», но я не могу искать в выводе и не могу передать его или использовать grep.

Помещение | или >> сразу после ./binaryfile, похоже, тоже не работает.

for i in {0..32767}; do 
    printf "AAAAAAAAAAAAA\x$(printf %x $i)" | ./binaryfile; 
    killall -s KILL binaryfile; 
done >> output.txt

Мне нужно получить текстовый файл со всеми результатами. Вместо этого файл (или grep) полностью пуст.

1 Ответ

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

Если killall в цикле имеет значение, я думаю, это означает, что программа бинарного файла не завершилась должным образом, иначе killall не имел бы никакого эффекта вообще и вывел бы сообщение об ошибке (такого процесса нет или что-то вроде этот). Поэтому я думаю, что сначала вы должны попытаться выяснить, почему процесс не завершается должным образом. Возможно, он запускает дочерний процесс, в то время как родительский процесс запускается при выходе. Если вы не можете помешать этому сделать это легко, вы можете попытаться синхронизировать свои процессы в bash-скрипте, чтобы у вас не возникало проблем со слишком многими процессами (убить их, прежде чем они смогут сделать что-то интересное, на самом деле не решить проблему).

Например, если вы скомпилируете и запустите этот скрипт, вы заметите, что вы получаете приглашение оболочки, в то время как программа по-прежнему выводит сообщения:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

void main(void) {
        pid_t parent_pid;
        pid_t my_pid;
        long i,j;

        parent_pid= getpid();

        fork();
        if(getpid() == parent_pid) {
                printf("I'm the parent process, Ill terminate\n");
                exit(1);
        } else {
                printf("I'm the child process, I'll live a bit longer\n");
                for(i=0;i < 100;i++) {
                        printf("Iteration %ld\n", i);
                        for(j=0;j < 500000000; j++);
                }
        }
}

Так что я думаю, что вам нужно синхронизировать свои процессы или убедиться, что программа завершена, прежде чем вы запустите ее в следующий раз. Кажется, для приведенного выше примера я не смог бы использовать wait (я имею в виду команду shell), но если нет другой возможности, вы могли бы поместить что-то в свой скрипт оболочки, как (хотя я знаю, что это немного неловко):

while pgrep binaryfile > /dev/null ; do
    sleep 2s
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...