私は次のように基本的な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
。