/proc/를 통해 매개변수를 전달할 수 없습니다./fd/0

/proc/를 통해 매개변수를 전달할 수 없습니다./fd/0

나는 다음과 같이 기본 C++ 프로그램을 작성했습니다.

#include <sstream>
#include <unistd.h>
#include <cstdio>
#include <iostream>

int main(void)
{
  int foo;
  std::cin >> foo;
  FILE* fd = fopen("./output", "a+");
  std::stringstream ss;
  ss << getpid() << std::endl;
  fputs(ss.str().c_str(), fd);
}

코드는 단순히 표준 입력의 입력을 예상하고 해당 프로세스 ID를 출력 파일에 추가합니다. 성공적으로 컴파일한 후 바이너리를 백그라운드 프로세스로 실행하고 를 ./my_binary&사용하여 해당 pid를 확인한 다음 더미 정수를 jobs -l사용하거나 전달하려고 합니다 . 프로세스가 예상한 대로 출력 파일에 쓰지 않고 종료됩니다. 내가 여기서 뭘 잘못하고 있는 걸까? 프로세스의 proc 디렉터리에서 설명자를 볼 수 있지만 프로세스가 백그라운드에서 실행될 때 어떻게든 차단됩니까?printf "6\0" >/proc/<pid>/fd/0echo -e "6\n" >/proc/<pid>/fd/00

이에 비해 fg <n>수동으로 정수를 입력하고 입력하여 예상되는 동작을 보여줄 수 있습니다.

편집하다:SIGTTINKusalananda의 의견을 바탕으로 tty의 입력을 기다리는 동안 백그라운드에 있는 프로세스에 대해 신호가 방출되고 있음 을 깨달았습니다 .

편집하다:문제를 완화할 수 있는 방법을 찾지 못해 SIGTTINT대신 명명된 파이프를 사용하기로 결정했습니다 stdin. 코드가 변경되었습니다(저도 C로 전환했는데 결국 순수 C를 사용하게 되었다는 사실을 깨달았습니다).

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

int main(void)
{
  char input[3]; 
  read(7, input, 2);
  int num = atoi(input);
  char output[256];
  memset(output, 0, 256);
  sprintf(output, "%d : %d\n", getpid(), num);
  write(13, output, strlen(output));

  return 0;
}

나는 파이프를 생성하고 mkfifo input_pipe프로시저를 호출하여 ./process 7<input_pipe 13>>output매개변수를 에 전달했습니다 input_pipe.

관련 정보