여러가지 프로세스중 특정 프로세스 interval 만 바꾸는법?

kjwgoc의 이미지

#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 을 바꿉니다 ㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.