Запрещение printf в дочернем процессе - PullRequest
0 голосов
/ 25 мая 2020

У меня есть приложение строки cmd в C под Linux, которое должно запускать другой процесс, проблема в том, что дочерний процесс много печатает в строке команд, и все приложение становится беспорядочным.

Можно ли запретить дочернему процессу печатать что-либо в строке cmd из родительского процесса? Было бы очень полезно, например, иметь возможность определить команду, которая разрешает или запрещает печать дочерним процессом.

Ответы [ 3 ]

6 голосов
/ 25 мая 2020

Существует освященная веками традиция просто перенаправлять вывод в битовое ведро (a) по строкам:

system("runChild >/dev/null 2>&1");

Или, если вы это делаете через fork/exec, просто перенаправьте дескрипторы файлов, используя dup2, между fork и exec.

Это не остановит определенный дочерний элемент от вывода на стандартный вывод но это будет очень сложно сделать.


(a) Обычно я не большой поклонник этого, на всякий случай что-то пойдет не так. Я бы предпочел перенаправить его в настоящий файл, который при необходимости можно будет изучить позже (и, в конце концов, удалить, если нет).

0 голосов
/ 25 мая 2020

Чтение Расширенный Linux Программирование затем системные вызовы (2) .

В недавнем Linux каждый исполняемый файл имеет формат ELF (кроме init или systemd; играть с pstree (1) или pro c (5) ) работает в процессе , запущенном fork (2) (или clone (2) ...) и execve (2) .

Вы можете использовать dup2 (2) с open (2) , чтобы перенаправить STDOUT_FILENO на /dev/null (см. null (4) , stdout (3) , fileno (3) )

У меня есть приложение строки cmd в C под Linux, которое должно запускать другой процесс, проблема в том, что дочерний процесс много печатает в строке команд

Я бы вместо этого предоставить способ выборочно перенаправить вывод дочернего процесса. Вы можете использовать программные аргументы или переменные среды (см. getenv (3) и / или Environment (7) ), чтобы предоставить такую ​​возможность вашему пользователю.

Примером такой командной программы, запускающей и перенаправляющей подпроцессы и перенаправляющей их, является ваш G CC компилятор (см. g cc (1) ; он запускается cc1 и как (1) и ld (1) ...). Рассмотрите возможность загрузки и изучения его исходного кода.

Изучите также - для вдохновения - исходный код некоторой оболочки (например, sa sh) или напишите свой собственный один.

0 голосов
/ 25 мая 2020

Можно решить, полностью отказавшись от printf и используя функцию, которая будет печатать только в том случае, если она вызывается в родительском процессе.

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void print(char *msg,int dadid) {
    if(dadid!=getpid()){
        printf(msg);
    }
}

int main(){
    int dadid=getpid();
    int son = fork();

//code
//code

print("huhuhu",dadid);
return 0;
}

также может работать с yr-отпечатками в ранее упомянутой проверке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...