Используйте PID проги в качестве аргумента этой самой проги - PullRequest
0 голосов
/ 09 марта 2019

У меня есть программа на C, которая ожидает строку в качестве аргумента, я могу использовать ее следующим образом:

./myprog "hello"

Что я хочу сделать:

  • Запустить программубез аргумента
  • Получить PID этой программы
  • Использовать этот PID в качестве основы для создания строки
  • Передать эту строку в качестве аргумента работающей программы.

Я знаю, как получить пид.Я могу сделать это так:

./myprog &
PID=$!

У меня есть другая прога для вычисления строки, которую я хочу с этим pid:

./StringFromPid $PID

Что я не знаю, это: как использоватьрезультат этой последней строки в качестве ввода myProg (который уже запущен, но без его строкового аргумента, зная, что при запуске без аргумента он просто закроется ...)

Я пробовал:

./StringFromPid $PID | ./myprog

Но есть две проблемы с ним:

  1. Он запускает другой экземпляр myprog, у которого есть другой pid, так что это не то, что я хочу.

  2. Почему-то это даже не работает.Я имею в виду, что вывод ./StringFromPid $ PID не используется в качестве ввода для ./myprog.Он просто закрывается, как если бы не было аргументов.

Я не могу изменить myprog, но я могу изменить StringFromPid;Я даже могу поместить код StringFromPid в мой bash-скрипт, так как он совсем не большой.И я прочитал много туто о скрипте bash, но я все еще новичок в этом (не много практики)

Я нашел решение, но оно не оптимально (далеко не так):

#!/bin/bash
./myprog $(echo $(./StringFromPid $(let "a = $$";let "b = 5"; let "c = a + b"; echo $c)))

+5, потому что я только что обнаружил, что при запуске этого скрипта разница +5 между его PID и PID myprog.Не знаю почему, но это работает.

Однако я все еще открыт для лучших решений.На самом деле это работает на моем компьютере (кстати, я нахожусь на Ubuntu 16.04), но в конце он должен работать на сервере CTF, где у меня нет прав администратора

1 Ответ

2 голосов
/ 09 марта 2019

Самый простой способ - запустить программу на Си.

#!/bin/bash

# pid of current shell
PID1=$$
echo $PID1

# do stuff

(
    # this is a subshell

    # $$ doesn't change but BASHPID does
    PID2=$BASHPID
    echo $PID2

    # the pid of this C program will be $PID2
    exec myCprogram $(./StringFromPid $PID2)

    # exec doesn't return
    echo "can't get here"
)

# do more stuff

Если вы работаете на платформе, поддерживающей ее, может быть возможно использовать трюк LD_PRELOAD для переопределения getpid().

Но exec проще.

...