여러가지 프로세스중 특정 프로세스 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:


댓글 달기