我有一项任务,我不太清楚如何去做。基本上我必须创建一个协调器进程,创建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;
}
老实说,我不知道如何解决这个问题。我真的很感激你的建议。提前谢谢!
答案 0 :(得分:0)
我尝试了你的问题,但我对你的问题的结构感到困惑,你的问题陈述真的不清楚。 每次10次(每次过程10次或总共10次(每次过程2次)
你说进程正在等待被唤醒,这暗示它们不是子进程,而是系统上运行的其他进程,并且需要fifo进行通信。
尽管如此,以下是我可以从有限的信息中得出的结论。
您需要创建一个函数,该函数将由协调器在第一个进程上调用10次(循环)(等待被唤醒)
该函数将递归调用第二个进程,依此类推,直到最后一个休眠进程。
您必须使用SIGUSR1,并在自定义信号处理程序中为其定义操作,
例如
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
~$