[解決済み] C言語でプロセスをバックグラウンドに配置する
2022-02-26 18:54:38
質問
現在、以下のような仕事の背景を作成するために飛び込んでいます。
C
と
&
. ノンブロッキングの
waitpid
というのは、これが動作するためには それはわかっています。 また、私はすでに、もし
&
がコマンドラインの最後に入力されます。 ただ、具体的にどのように終了を伴う処理をバックグラウンドジョブとして送り、また、別のプロンプトが次のコマンドを要求している間に実行するように実装すればいいのかがわかりません。
何でもいいので、よろしくお願いします。
struct bgprocess{
int pid;
struct bgprocess * next;
struct bgprocess * prev;
};
struct bgprocess * bgprocess1;
bgprocess1 = malloc(sizeof(struct bgprocess));
bgprocess1->prev = NULL;
bgprocess1->next = NULL;
bgprocess1->pid = NULL;
struct bgprocess * current;
current = bgprocess1;
do{
int bgreturn = 0;
while (current != NULL){
if (waitpid(current->pid, &bgreturn, WNOHANG)){
printf("Child exited");
current->prev->next = current->next;
current->next->prev = current->prev;
current->prev = NULL;
current->next = NULL;
free(current);
}
current = current->next;
}
if (end){
int pid = fork();
if (pid < 0){
exit(1);
}
if (pid) {
execvp(args[0], args);
exit(0);
}
struct bgprocess * newNode;
newNode = malloc(sizeof(struct bgprocess));
newNode->pid = pid;
newNode->next = NULL;
if (current->next == NULL){
current->next = newNode;
}
while (1){
if (current->next == NULL){
current->next = newNode;
}
current = current->next;
}
}
}
while (current != NULL);
int bgreturn = 0;
while (current != NULL){
if (waitpid(current->pid, &bgreturn,0)){
printf("Child exited");
current->prev->next = current->next;
current->next->prev = current->prev;
current->prev = NULL;
current->next = NULL;
free(current);
}
current = current->next;
}
}
さて、それでもう少し作業してみたのですが、なんとなく分かってきたような気がします。 まだいくつかのシンタックスエラーがあり、それを修正する方法がわからないので、誰かがそれを指摘しない限り、おそらくgdbか何かを使用することになるでしょう。 私は正しい方法でそれを行っていますか、それとも完全に間違っていますか?
どのように解決するのですか?
シェルを実装しているようですね。
を使うだけです。 フォーク を使用して子プロセスを作成します。 そこから exec*ファミリー を使って好きな実行ファイルを実行したり、親が戻ってより多くの情報(次のコマンドなど)を要求している間に子で単にCコードを実行したりすることができます。 待機 をWNOHANGオプションと一緒にループの先頭に置き、 終了した子プロセスをチェックし、最後にもう一度(今回はWNOHANGなしで) 残りの子プロセスをチェックします。
私は、これを実際以上に複雑にしないように勧めなければなりません。 欲しいものを平易な英語(または母国語、擬似コード)で書き出し、それを最小限の工夫でC言語に翻訳するだけです。
(擬似)コードです。
struct child {
int pid;
struct child * next;
struct child * prev;
}
struct child * children = null;
do {
int return = 0;
struct child * curr = children;
while(curr != null){
if(waitpid(curr->pid, &return, WNOHANG)){
//Report child exited with return status 'return'
//Remove child (linked list style)
}
curr = curr->next;
}
/* PROMPT, ETC */
if ( doInBackground ){
int pid = fork();
if(pid <0 )exit(); //error
if(pid){
//Child
execvp(processName, arrayOfArgs);
//This should never get executed
exit();
}
//Add pid (linked list style, again)
}
}while(!exitCondition)
int return = 0;
struct child * curr = children;
while(curr != null){
if(waitpid(curr->pid, &return, 0)){
//Report child exited with return status 'return'
//Remove child (linked list style)
}
curr = curr->next;
}
関連
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] time(1) の出力における 'real', 'user' および 'sys' はどのような意味ですか?
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] Linuxで特定のポートで動作しているプロセスを停止させる方法は?
-
[解決済み] バックグランドプロセスのプロセスIDを取得する方法を教えてください。
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み】スレッド1:EXC_BAD_ACCESS(コード=1、アドレス=0x0)標準Cメモリ問題
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC