首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建进程池C Linux

创建进程池C Linux
EN

Stack Overflow用户
提问于 2017-05-13 18:26:18
回答 2查看 1.4K关注 0票数 1

我有一项任务,我不太确定该怎么做。基本上,我必须创建一个协调器进程,该进程创建5个等待唤醒的工作进程。协调器将一个标记(整数)传递给第一个进程,然后该进程将该标记加1并将其传递给下一个进程。协调器进程唤醒执行相同操作的下一个进程,依此类推。所谓的标记应该经过所有过程10次,最后它的值应该由协调器打印出来。应使用信号以及标记的共享内存。

所以我创建了5个进程,我认为在每次迭代中都应该有一个信号和一个处理程序被传递,它将基本上完成标记的所有工作。这是我第一次使用进程。这就是我到目前为止所知道的:

代码语言:javascript
复制
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/shm.h>
    #include <signal.h>

    #define numOfProcesses 5
    pid_t procIDs[5];
    void handler(int signum){
        //marker and all work here
    }
    void createProcesses(){
        int i;
        for(i = 0; i < numOfProcesses; i++){
            procIDs[i] = fork();
            if(procIDs[i] < 0 ){
                perror("Fork error!");
            }else if(procIDs == 0){
                pause();
            }
        }
    }

    int main(){
        createProcesses();
        int i;
        for(i = 0; i < numOfProcesses; i++){
            pkill(SIGUSR1, handler);
        }

        return 0;
    }

老实说,我不知道该怎么做。我真的很感谢你的建议。提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2017-05-13 23:07:16

这就是我想出来的。抱歉回答,我找不到如何在注释中格式化代码。无论如何:每个进程都应该是10次。我使用的是共享内存,所以我想我不需要标记的全局变量?这就是我的想法:

代码语言:javascript
复制
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<sys/shm.h>
#include<signal.h>
#include<sys/ipc.h>

#define numOfProcesses 5
#define numOfLoops 10

pid_t* procIDs[5];

void createProcesses(){
    int i;
    for(i = 0; i < numOfProcesses; i++){
        procIDs[i] = fork();
        if(procIDs[i] < 0 ){
            perror("Fork error!");
        }
        else if(procIDs == 0){
            pause();
        }
    }
}

void init(){//init marker = 0
    key_t mykey = ftok(".", 0);
    int shID = shmget(mykey, sizeof(int), 0666 | IPC_CREAT);
    int *data;
    data = (int*) shmat(shID, 0, 0);
    *data = 0;
}

int* getValue(){//get value of marker
    key_t mykey = ftok(".", 0);
    int shID = shmget(mykey, sizeof(int), 0666 | IPC_CREAT);
    int *data = shmat(shID, 0, 0);
    return data;
}

void increment(int sig){//increment + 1
    if(sig == SIGUSR1){
        int temp;
        int* data;
        data = getValue();
        temp = *data;
        temp++;
        *data = temp;
    }
}

void yourFunc(int count, pid_t* mypid, int mysig){
    if(count == 0){
        return;
    }else{
        printf("Signal sent :: to PID : %d\n", mypid);
        kill(*mypid, SIGUSR1);
        yourFunc(count -1, ++mypid, SIGUSR1);
    }
}

int main(){
    signal(SIGUSR1, increment);
    init();
    int i,j;
    createProcesses();

    for(j = 0; j < numOfLoops; j++){//loop every pid 10 times
        pid_t* currProcess = procIDs[0];
        yourFunc(numOfProcesses, currProcess, SIGUSR1);
    }
    int* data = getValue();
    printf("Marker: %d\n", *data);
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2017-05-13 22:12:17

我试过你的问题,但我真的对你的问题的结构感到困惑,真的不清楚你的问题陈述是什么。每次10次(每个进程10次或总共10次(每个进程2次))

您说进程正在等待被唤醒,这暗示着它们不是子进程,而是系统上运行的其他进程,并且需要fifo进行通信。

然而,以下是我可以从有限的信息中得出的结论。

  1. 您需要创建一个函数,该函数将被第一个进程(等待被唤醒)上的协调器调用10次(循环)
  2. 该函数将递归地调用第二个进程,依此类推,直到最后一个休眠进程必须使用SIGUSR1,并在自定义信号处理程序

中为其定义操作

例如:

代码语言:javascript
复制
signal(SIGUSR1,custom_handler)

您需要将marker保留为全局变量。因为C是一种过程化语言,内核的调度不在您的掌握之中,一旦一个进程终止,您就不能再调用它,也不能确保在派生时对一个进程使用相同的PID。

因此,如果您正在考虑在函数内部创建进程,这些进程将暂停,并在获得信号时恢复,很好……!,但这将是一次性的。

由于你的问题提供的信息有限,我只能说这些。

下面是C中的上述思想。初始化计数=5(否。调用程序中的进程)。mypid指向第一个进程的PID。

代码语言:javascript
复制
void party_time(int count, pid_t* mypid, int mysig)
{
    if(count == 0)
        return;
    else
    {
        printf("Signal sent :: to PID : %d\n",*mypid);
        kill(*mypid,SIGUSR1);
        party_time(count - 1 ,++mypid,SIGUSR1);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43952006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档