创建进程池C Linux

时间:2017-05-13 10:26:18

标签: c process signals shared-memory

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

所以我创建了5个进程,我想在每次迭代时都应该有一个信号,并且应该传递一个处理程序,它基本上可以完成标记的所有工作。 这是我第一次使用流程。这就是我到目前为止所做的:

    #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;
    }

老实说,我不知道如何解决这个问题。我真的很感激你的建议。提前谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

尽管如此,以下是我可以从有限的信息中得出的结论。

  1. 您需要创建一个函数,该函数将由协调器在第一个进程上调用10次(循环)(等待被唤醒)

  2. 该函数将递归调用第二个进程,依此类推,直到最后一个休眠进程。

  3. 您必须使用SIGUSR1,并在自定义信号处理程序中为其定义操作,

  4. 例如

    signal(SIGUSR1,custom_handler)
    

    您需要将标记保留为全局变量。 因为C是一种过程语言,并且一旦进程终止,内核的调度就不在你手中,你无法回想起它或者为分叉过程确保相同的PID。

    因此,如果您正在考虑在暂停的函数内部创建进程,并且在恢复信号时应该恢复,那么.....!,但这将是一次性的。

    我能用你提出的有限信息来说明这一点。

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

    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);
        }
    
    }
    

答案 1 :(得分:0)

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

~$ cat vikas.go
//usr/bin/env go run "$0" "$@"; exit

package main

import "fmt"

func main() {
    fmt.Printf("Hello World\n")
}
~$

~$ ./vikas.go
Hello World
~$