2017-05-13 7 views
1

私には割り当てがあり、どうやってそれをどうやって進めるのかはわかりません。基本的に私は、目覚めて待っている5つの作業プロセスを作成するコーディネータープロセスを作成する必要があります。コーディネーターは最初のプロセスにマーカ(整数)を渡し、マーカを1つインクリメントして次のプロセスに渡します。コーディネータープロセスは、同じことをする次のプロセスを起こします。いわゆるマーカーはすべてのプロセスを10回通過し、最終的にその値はコーディネーターによって印刷されるべきです。シグナルは、マーカーの共有メモリーと同様に使用する必要があります。プロセスプールの作成C Linux

私は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

私はあなたの問題を試しましたが、私は本当にあなたの問題の説明が本当に不明な、あなたの質問の構造に本当に困惑しています。 各10回(1プロセスあたり10回または合計10回(1プロセスあたり2回)

プロセスは、システム上で実行中の他のプロセスではなく、子プロセスではないことを暗示する、および通信にFIFOを必要とする。

にもかかわらず、次のように私は限られた情報から結論ことができるものである。

  1. あなたは10回(ループ)を呼び出される関数を作成する必要があることにより、最初のプロセスのコーディネーター(目を覚ますのを待つ)

  2. この関数は、最後のスリーププロセスまで再帰的に2番目のプロセスを呼び出します。

  3. あなたは、例えば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); 
    } 

} 
+0

各プロセスの10倍でなければなりません。共有メモリを使用しているので、マーカーのグローバル変数は必要ありませんか?これは私が思いついたものです: – spec

0

これは私が思いついたものです。申し訳ありませんが、コメントのコードの書式設定方法を見つけることができませんでした。とにかく: それは各プロセスの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; 
} 
関連する問題