【发布时间】:2020-10-04 03:03:32
【问题描述】:
我需要创建一个程序,该程序将启动 4 个进程之间的竞赛,以从用户输入中获取一个数字。用户将输入 4 个数字(1 到 4),收到第一个数字 (1) 的进程将成为获胜者,首先,随后的进程将获得第二、第三和第四名,具体取决于他们从用户。
程序将首先使用fork()系统调用创建4个进程,每个创建的进程由一个1到4的数字标识,这个数字表示它的创建顺序。例如,创建的第一个子进程的 ID = 1。
毕竟,进程被创建,进程将开始向用户请求一个数字。每个进程都会打印它从用户那里得到的号码,并打印它的 ID 号。父进程不参与比赛,等待所有子进程完成后退出。
我认为我已经完成了基本结构,但我不确定如何在进程之间传递值,或者是否正在完成合法的竞争条件。我也无法运行最后 3 个进程。
这是我的输出:
这是预期的输出:
这是我目前所拥有的:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
int p1, p2, num;
int procNUM = 1, runNum = 1 ;
void game(int p1,int p2);
int main() {
printf("Enter numbers for processes to race for >>>\n");
p1 = fork();
p2 = fork();
if (p1 > 0 && p2 > 0) {
//parent
printf(" I am a process with pid %d and I am process number %d in the race.\n",getpid(), procNUM);
procNUM++;
// fflush(stdout);
// scanf("%d", &num);
// printf("%d", &num);
// printf(I am a processs with);
}
else if (p1 == 0 && p2 > 0)
{
//child 1
printf(" I am a process with pid %d and I am process number %d in the race.\n",getpid(), procNUM);
procNUM++;
// fflush(stdout);
}
else if (p1 > 0 && p2 == 0)
{
//child 2
printf(" I am a process with pid %d and I am process number %d in the race.\n",getpid(), procNUM);
procNUM++;
//fflush(stdout);
}
else {
//child 3
printf(" I am a process with pid %d and I am process number %d in the race.\n",getpid(), procNUM);
procNUM++;
// fflush(stdout);
}
game(p1, p2);
return 0;
}
void game(int p1,int p2){
if (p1 > 0 && p2 > 0) {
//parent
scanf("%d", &num);
printf(" I am a process with pid %d and I am process number %d in the race and I am in %d place.\n",getpid(), procNUM, runNum);
//fflush(stdout);
runNum++;
}
else if (p1 == 0 && p2 > 0)
{
//child 1
scanf("%d", &num);
printf(" I am a process with pid %d and I am process number %d in the race and I am in %d place.\n",getpid(), procNUM, runNum);
//fflush(stdout);
runNum++;
}
else if (p1 > 0 && p2 == 0)
{
//child 2
scanf("%d", &num);
printf(" I am a process with pid %d and I am process number %d in the race and I am in %d place.\n",getpid(), procNUM, runNum);
// fflush(stdout);
runNum++;
}
else {
//child 3
scanf("%d", &num);
printf(" I am a process with pid %d and I am process number %d in the race and I am in %d place.\n",getpid(), procNUM, runNum);
//fflush(stdout);
runNum++;
}
}
【问题讨论】:
标签: c linux pipe fork race-condition