我有一项任务,我不太确定该怎么做。基本上,我必须创建一个协调器进程,该进程创建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;
}老实说,我不知道该怎么做。我真的很感谢你的建议。提前感谢!
发布于 2017-05-13 23:07:16
这就是我想出来的。抱歉回答,我找不到如何在注释中格式化代码。无论如何:每个进程都应该是10次。我使用的是共享内存,所以我想我不需要标记的全局变量?这就是我的想法:
#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;
}发布于 2017-05-13 22:12:17
我试过你的问题,但我真的对你的问题的结构感到困惑,真的不清楚你的问题陈述是什么。每次10次(每个进程10次或总共10次(每个进程2次))
您说进程正在等待被唤醒,这暗示着它们不是子进程,而是系统上运行的其他进程,并且需要fifo进行通信。
然而,以下是我可以从有限的信息中得出的结论。
中为其定义操作
例如:
signal(SIGUSR1,custom_handler)您需要将marker保留为全局变量。因为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);
}
}https://stackoverflow.com/questions/43952006
复制相似问题