나는 다음과 같이 기본 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/0
echo -e "6\n" >/proc/<pid>/fd/0
0
이에 비해 fg <n>
수동으로 정수를 입력하고 입력하여 예상되는 동작을 보여줄 수 있습니다.
편집하다:SIGTTIN
Kusalananda의 의견을 바탕으로 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
.