2017-04-16 20 views
0

Cでは、外部プログラムを実行してこのプログラムのPIDを取得する最良の方法は何ですか? ここでfork()の使用についていくつかの答えを見ました......しかし、私が理解しているように、fork()の現在のproccessを作成し、子を作成します。可能であれば、私は完全に分離されたコンテキストを作りたいと思っています...... PIDを取得する理由は、これを将来正確に処理することです。サーバーがクライアント上のいくつかのプログラムを起動するためのコマンドを送信できるときにクライアント/サーバープログラムを構築しています。これらのプログラムは外部であり、同じ名前/実行可能ファイルを同時に実行することができます(これが私がプログラム名でpidを見つけることができない理由です)。また、これらのプログラムは 'バックグラウンド'で実行する必要があります....私は、私の呼び出し関数をロックすることはできません。 このシナリオでfork()が助けになるかどうか分かりません。C - バックグラウンドで外部プログラムを起動してpidを取得

+0

研究このスレッド:http://stackoverflow.com/questions/5883462/linux-createprocess#5884588 – cmks

+0

あなたがデーモン(3)を使用することができます安全なpidを他のデーモンと同様に扱います – fghj

+1

'fork()'と 'exec *()'関数のどちらかを使用するのが通常の方法です。 I/Oを再構成したり、パイプ記述子やその他のものを閉じる必要がある場合は、 'posix_spawn()'よりも簡単です。 'posix_spawn()'でそれらを操作することはできますが、それは難しい作業です。 –

答えて

0

私がしたいのはposix_spawnです。それはforkよりも使用する方がはるかに簡単だとIMOは、多くの、より直感的に感じている:

#include <spawn.h> 
#include <string.h> 
#include <stdio.h> 

extern char **environ; 

int main() { 
    pid_t pid; 
    char *argv[] = {"gcc", "file.c" (char*)0}; 

    int status = posix_spawn(&pid, "/usr/bin/gcc", NULL, NULL, argv, environ); 
    if(status != 0) { 
     fprintf(stderr, strerror(status)); 
     return 1; 
    } 
    return 0; 
} 
+0

これは私が必要とするものを正確に見える!私はここでテストして報告します:) Tks! –

+0

ちょっとした問題があります....私はこの問題を解決できません:(私は間違っていますか?私は実行可能ファイルを直接(shなしで)開き、すべて正常に動作しています。 htopを使ってpidが正しいことを確認することができます。しかし、私が送るシグナル(Cまたはコマンドラインのどちらでも)は何もしません。 –

関連する問題