2017-05-13 14 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 회 (프로세스 당 10 회 또는 총 10 회 (프로세스 당 2 회)

프로세스가 시스템에서 실행중인 다른 프로세스가 아니라 자식 프로세스가 아니라는 것을 알려주는 대기 모드라고합니다 와 통신하기 위해 FIFO를 필요로한다.

을 그럼에도 불구하고, 다음 내가 제한된 정보로부터 결론을 내릴 수있는 것입니다.

  1. 을 당신은 10 배 (루프)가 호출 될 함수를 작성해야 첫 번째 프로세스의 코디네이터 (깨우기 위해 대기 중)

  2. 이 함수는 마지막 잠자는 프로세스까지 재귀 적으로 두 번째 프로세스를 호출합니다.

  3. 당신은 SIGUSR1을 사용해야하고, 사용자 정의 신호 처리기에 대한 조치를 정의 할 것이다,

는 예를 들면.

signal(SIGUSR1,custom_handler) 

마커를 전역 변수로 유지해야합니다. C는 절차 언어이므로 프로세스가 종료 된 후에도 커널의 일정을 손에 넣을 수 없으므로이를 호출하거나 프로세스에서 동일한 PID를 포크 할 수 없습니다.

잠깐 멈추고 신호를받는 함수 내부에서 프로세스를 만들려고한다면 괜찮습니다 .....!하지만 일회 일 것입니다.

귀하의 질문에 대한 제한된 정보로 그게 전부입니다.

다음은 위의 아이디어입니다. 호출자의 초기화 횟수 = 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; 
}