C语言 循环分叉并打印正确的过程编号

xwbd5t1u  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(144)

C脚本应该接受x个CPU绑定的fork和x个IO绑定的fork,所以假设总共有10个进程,如果每个进程都有5个,如果我fork 10次,则其中的5个应该去处理CPU限制的“假工作”,而其中的5个应该去处理IO限制的“假工作”。Waitstats是一个自定义函数,用于在显示rtime和wtime的同时等待。
我的问题是,我已经尝试了多种配置,我不知道如何让进程号printf正确打印,只有10次,如果只有10个分叉?我还觉得我没有正确地为CPU/IO绑定的工作做我的假工作。
任何帮助都将不胜感激!
`

int main(int argc, char* argv[])
{

    int cpuNum = atoi(argv[2]);
    int ioNum = atoi(argv[4]);

    int const MAX_PROC = cpuNum + ioNum;
    printf("\nMax Proc %d", MAX_PROC);

    int totRunTime = 0;
    int totWaitTime = 0;

    uint rTime = 0;
    uint wTime = 0;

    int pid = 0;
    //Create Max_Proc Forks
    for(int n=0; n < MAX_PROC; n++) 
    {
        pid = fork();
        //If Child, Exceute Command
        if(pid == 0)
        {
            break;
        }

    }

    if (cpuNum > 0) {
        //CPU Busy Work
        for (volatile int i = 0; i < 1000000000; i++){}
        cpuNum--;
    }
    else if (ioNum > 0) {
        //IO Busy Work
        sleep(200);
        ioNum--;
        
    }
    

    for(int p=0; p < MAX_PROC; p++) 
    {
        printf("\n Process %d finished", p);
        if(waitStats(0, &rTime, &wTime) >= 0) 
        {
            totRunTime += rTime;
            totWaitTime += wTime;
        }

    }

    printf("\nAverage rtime %d, wtime %d", rTime, wTime);

    exit(0);

}

`
我尝试了多种配置,但似乎不能让printf打印正确的进程/分支数。例如,分支10次意味着每次这些分支中的一个完成它们的任务时,我都需要printf(总共10次)。

vyswwuz2

vyswwuz21#

显示的代码不打印pid,所以我假设您的意思是“进程号”,如第一个孩子,第二个孩子等。
您的每个进程都在运行以下代码:

for(int p=0; p < MAX_PROC; p++) 
{
    printf("\n Process %d finished", p);
    ...

因此,看起来每个进程都将打印数字0.. MAX_PROC-1(没有指示正在打印哪个pid)

h6my8fg2

h6my8fg22#

您是否尝试过将waitStats for循环放在“Create Max_Proc Forks”for循环中?因此,基本上所有内容都应放在第一个循环中,这可能会为您提供跟踪进程号的好方法。

相关问题