여러가지 프로세스중 특정 프로세스 interval 만 바꾸는법?
글쓴이: kjwgoc / 작성시간: 월, 2013/07/22 - 1:24오후
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<unistd.h> #include<semaphore.h> #include<sys/shm.h> #include<sys/mman.h> #include<sys/wait.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/stat.h> #include<sys/ipc.h> #include<sys/sem.h> #include<netinet/in.h> union semun { int val; }; int main() { int semid; int status,tag,choice,fd,base,temp; int sockfd_listen; int sockfd_connect; int shmid; ssize_t fr,fw; pid_t pid; sem_t *sem; char client[]="client"; char process[]=" PID is"; char data[] = "program runs at "; char temp1[10]; char temp2[10]; char temp3[10]; char buffer1[1024]; char buffer2[1024]; char buffer3[1024]; char buf[1024]; int *interval; char *message1 = "Change particular interval"; char *message2 = "Execute new program"; off_t newpos; void *shared_memory =NULL; key_t keyval; union semun sem_union; keyval = 1488; tag = 1; base = 10; struct sembuf semopen = {0,-1,SEM_UNDO}; struct sembuf semclose = {0,1,SEM_UNDO}; struct sockaddr_in server = {AF_INET,5000,INADDR_ANY}; printf("open socket\n"); sockfd_listen = socket (AF_INET,SOCK_STREAM,0); printf("bind\n"); bind(sockfd_listen,(struct sockaddr*)&server,sizeof(struct sockaddr_in)); printf("listen\n"); listen(sockfd_listen,5); pid = fork(); if(pid < 0) { exit(EXIT_FAILURE); } if(pid > 0) { exit(EXIT_SUCCESS); } setsid(); close(2); shmid = shmget((key_t)1488,1024,0666|IPC_CREAT); if(shmid == -1) { printf("fail to shmget\n"); } shared_memory = shmat(shmid,NULL,0); interval = (int *)shared_memory; if(shared_memory == (void*)-1) { printf("fail to shmat\n"); } semid = semget((key_t)1488,1,IPC_CREAT|0666); if(semid == -1) { printf("fail to semget\n"); } sem_union.val = 1 ; semctl(semid,0,SETVAL,sem_union); printf("you should keep in mind that biggest pid is waiting connect\n"); while(1) { sockfd_connect = accept(sockfd_listen,NULL,NULL); printf("connect\n"); pid = fork(); recv(sockfd_connect,&choice,1,0); if(choice == 1 && pid != 0) { //want to change specific sleep interval recv(sockfd_connect,&temp,2,0); printf("%s\n",message1); printf("we will change program's interval into %d \n",*interval); if(*interval != 10) { sprintf(temp3,"%d",*interval); strcat(data,temp3); fd = open("data.conf",O_WRONLY|O_TRUNC); fw = write(fd,data,20); close(fd); } exit(EXIT_SUCCESS); } if(choice == 2 && pid != 0) { printf("%s \n",message2); sprintf(temp1,"%d",tag); sprintf(temp2,"%d",getpid()); strcat(client,temp1); strcat(client,process); strcat(client,temp2); strcat(client,"\0"); fd = open ("info.conf",O_RDWR|O_APPEND); fw = write(fd,client,25); newpos = lseek(fd,(off_t)0,SEEK_SET); fr = read(fd,buffer2,1024); printf("%s\n",buffer2); close(fd); while(1) { if(semop(semid,&semopen,1) == -1) { printf("fail to semop\n"); } fd = open("data.conf",O_RDONLY); fr = read(fd,buffer1,1024); printf("\n%s",buffer1); sleep(*interval); semop(semid,&semclose,1); close(fd); } } tag++; } close(sockfd_listen); close(sockfd_connect); return 0; }
이건 서버+데몬프로그램 코드이고 보시면 소켓으로 통신하는 tcp 입니다.choice 값이 1이면 존재하는 프로세스중 하나를 골라 sleep interval 을 바꿔주고 값이 2이면 새로운 데몬 프로세스를 생성합니다
제가 궁금한거는 여기서 만약 복수개의 프로세스가 생성되어있다면 어떻게 하나의 프로세스만 sleep interval 을 바꿔주는걸까요???]
제가 이걸 작동시키면 세마포어때문에 모든 프로세스가 1개씩 순차적으로 자신의 sleep interval 을 바꿉니다 ㅜ
Forums:
댓글 달기