2016-08-13 23 views
1

Cから別のプログラムを実行/オープン/実行する方法です。ブロックしないで同時に実行してください。それから、私はサーバ/クライアントのようなテストをしたいと思います。私は約Cから別のプログラムを開いて実行してから、このプログラムを閉じます。

system() or execv() 

しかし、第一、第二、Linux上でのみ動作しているようですが、結果を待っを遮断しているようだ読んだことがありますか?ベストプラクティスのシナリオでは、クロスプラットフォームまたはMacOS/Windows/Linux(Ubuntu)の最小の作業ソリューションが必要です。もうこれを必要としないときに、以前に開いたプログラムをシャットダウンする必要もあります。

Cから別のプログラムを実行/オープン/実行するための方法

答えて

3

それを行うにはPOSIXの方法についてのアイデアを持っていません(多分あまりにもWindowsで使用できる - ?https://technet.microsoft.com/en-us/library/bb463220.aspxを) されますfork + exec*コンボを使用する:

forkを使用して、現在のプロセスをコピーする新しいプロセスを作成します。 そのプロセスへのあなたのハンドルがint型プロセス識別子(PID)です:

int pid; 

if (0 > (pid=fork()){ 
    perror("fork failed"); 
    return -1; 
} 
if (0 == pid){ 
    //CHILD PROCESS 
    printf("I'm the child process, my pid is: %d\n", getpid()); 

} 
//pid > 0 ==> PARENT PROCESS 
puts ("I'm the parent process"); 
printf("The pid of the child I've just spawned is %d\n", pid); 

子供のあなたならば、例えば(電流を交換するexec*機能を使用して、子プロセスで実行可能ファイルを実行するには実行可能ファイルからロードされたプロセスイメージで子プロセスイメージを実行します)。親で

、あなたがして(終了し、それを頼む=)killにプロセスをPIDハンドルを使用することができます。

kill(pid, SIGTERM); //please terminate 

、それが終了した後、あなたは、その終了ステータスを取得するためにwaitpidを使用することができます。


waitpid部分がsystemは、子プロセスが終了するのを待てなり、systemに分離ではありませんのでsystemが内部。fork + execv(それはシェルを幹部)+ waitpidを使用しています。)

あなたはおそらくも、子プロセスでfildescriptorベースの通信チャネルを設定するdup2pipeまたはsocketpairに見たいと思うでしょうあなたの場合にのみ、(他の共有メモリなどのオプション、メッセージキュー、または信号があります非常に基本的なコミュニケーションが必要です)。

マンページは、プロセスとIPCの管理に役立つリソースです。

+0

thxこれは大いに役立ちます:)私は将来的に使うつもりだと思いますが、私はもっと簡単にテストを再設計します:1.別のpthreadでテストサーバーを実行する2. popen()でこのサーバーをエコーするシェルcmdを実行する3。 cmdの出力を取得し、それが正しいと主張してください。 –

0

:?それを妨げない方法

使用system

あなたはマルチタスクを実現するため、別のスレッドを作成するために、別のプロセスやpthread_create を作成するためにforkを使用して、私はクロスプラットフォームまたは最小のMacOSがしたいthis

を見て取らなければなりません/ Windows/Linux(Ubuntu)の作業ソリューション

system LinuxとWindows上で動作しますが、私は他のプラットフォーム

+0

ok thxですが、後で閉じることができますか? –

+0

@MichałZiobro、どうぞよろしいですか? – Mouin

関連する問題