ユーザー入力値「n」に基づいて、その多くのプロセスをフォークして同時に実行するプログラムを作成しようとしています。さらに、各子は、私が作成した別のファイルを実行しようとしています。これにより、斧のスリープ時間と斧の終了値が生成されます。最終的に、子が死亡した場合、親は pid と exit_status を出力する必要があります。重要な部分は、子供の死が x であり、同時ではないことを確認することです。これまでのところ、私が理解できないことが2つあります。
- execl に sleep.c ファイルを実行させる (以下に示す)。
- 子供たちを規則正しい方法ではなくランダムにフォークして死亡させ、その結果、生成されたランダムな終了ステータスで誰が死亡したかを出力します。
Sleep.c と Ranchild.c の 2 つのファイルがあります。
SLEEP.C
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
/* Generated random sleep time, and return random exit value */
int main()
{
/* Calculate A Random Time To Sleep 1 - 10 Seconds*/
srand(time(NULL));
int r = (rand() % 10) + 1;
printf("Sleep Time: %d\n", r);
sleep(r);
/* Calculate A Random Exit Value */
int r2 = (rand() % 30) + 1;
exit(r2);
}
RANCHILD.C
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
int main()
{
/* Get User Input */
int i, n;
printf("Please Enter An Integer!\n");
/* Test User Input */
if(!scanf("%d", &n)) {
printf("Invalid Input!\n");
return -1;
}
/* Initialize Needed Variables */
pid_t pid[n];
int status, exit_status;
for(i = 0; i < n; i++) {
if((pid[i] = fork()) < 0) {
perror("Fork Failed!");
return -2;
}
if(pid[i] == 0) {
execl("sleep", "sleep", (char *)0);
} else {
/* Print Child Results */
if (waitpid(-1, &status, WNOHANG) == 0) {
if(WIFEXITED(status)) {
exit_status = WEXITSTATUS(status);
printf("Exit Status From %d was %d!\n", pid[i], exit_status);
}
}
}
}
exit(0);
}
Sleep ファイルに対して exec を実行することはできません。結果のサンプルは次のとおりです。
3
Exit Status From 27369 was 0!
Exit Status From 27370 was 0!
Exit Status From 27371 was 0!
Sleep Time: 4
Sleep Time: 4
Sleep Time: 4
あなたの助けは大歓迎です!!