http://www.perfgeeks.com/?p=723
- compile the master.c slave.c(gcc,or make)
echo "0" > /tmp/shm_command./masterin one terminal./slavein other terminal
http://www.perfgeeks.com/?p=723
echo "0" > /tmp/shm_command./master in one terminal./slave in other terminal| all: | |
| gcc -o master ./master.c | |
| gcc -o slave ./slave.c | |
| clean: | |
| rm -f master slave |
| #include <stdio.h> | |
| #include <time.h> | |
| #include <stdlib.h> | |
| #include <sys/mman.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| void listen(); | |
| int main(int argc, char *argv[]) | |
| { | |
| listen(); | |
| return 0; | |
| } | |
| void listen() | |
| { | |
| int fd; | |
| char *buf; | |
| char *fname = "/tmp/shm_command"; | |
| char command; | |
| time_t now; | |
| fd = open(fname, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR); | |
| if (fd == -1) | |
| { | |
| perror("open"); | |
| exit(1); | |
| } | |
| buf = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); | |
| if (buf == MAP_FAILED) | |
| { | |
| perror("mmap"); | |
| exit(1); | |
| } | |
| if (close(fd) == -1) | |
| { | |
| perror("close"); | |
| exit(1); | |
| } | |
| *buf = '0'; | |
| sleep(2); | |
| for (;;) | |
| { | |
| if (*buf == '1' || *buf == '3' || *buf == '5' || *buf == '7') | |
| { | |
| if (*buf > '1') | |
| printf("%ld\tgood job [%c]\n", (long)time(&now), *buf); | |
| (*buf)++; | |
| } | |
| if (*buf == '9') | |
| { | |
| break; | |
| } | |
| sleep(1); | |
| } | |
| if (munmap(buf, 4096) == -1) | |
| { | |
| perror("munmap"); | |
| exit(1); | |
| } | |
| } |
| #include <stdio.h> | |
| #include <time.h> | |
| #include <stdlib.h> | |
| #include <sys/mman.h> | |
| #include <sys/types.h> | |
| #include <sys/stat.h> | |
| #include <fcntl.h> | |
| #include <unistd.h> | |
| void ready(unsigned int t); | |
| void job_hello(); | |
| void job_smile(); | |
| void job_bye(); | |
| char get_command(char *buf); | |
| void wait(); | |
| int main(int argc, char *argv[]) | |
| { | |
| wait(); | |
| return 0; | |
| } | |
| void ready(unsigned int t) | |
| { | |
| sleep(t); | |
| } | |
| /* command 2 */ | |
| void job_hello() | |
| { | |
| time_t now; | |
| printf("%ld\thello world\n", (long)time(&now)); | |
| } | |
| /* command 4 */ | |
| void job_simle() | |
| { | |
| time_t now; | |
| printf("%ld\t^_^\n", (long)time(&now)); | |
| } | |
| /* command 6 */ | |
| void job_bye() | |
| { | |
| time_t now; | |
| printf("%ld\t|<--\n", (long)time(&now)); | |
| } | |
| char get_command(char *buf) | |
| { | |
| char *p; | |
| if (buf != NULL) | |
| { | |
| p = buf; | |
| } | |
| else | |
| { | |
| return '0'; | |
| } | |
| return *p; | |
| } | |
| void wait() | |
| { | |
| int fd; | |
| char *buf; | |
| char *fname = "/tmp/shm_command"; | |
| char command; | |
| time_t now; | |
| fd = open(fname, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); | |
| if (fd == -1) | |
| { | |
| perror("open"); | |
| exit(1); | |
| } | |
| buf = mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); | |
| if (buf == MAP_FAILED) | |
| { | |
| perror("mmap"); | |
| exit(1); | |
| } | |
| if (close(fd) == -1) | |
| { | |
| perror("close"); | |
| exit(1); | |
| } | |
| for (;;) | |
| { | |
| command = get_command(buf); | |
| /*printf("%c\n", command);*/ | |
| switch(command) | |
| { | |
| case '0': | |
| printf("%ld\tslave is ready...\n", (long)time(&now)); | |
| ready(3); | |
| *buf = '1'; | |
| break; | |
| case '2': | |
| job_hello(); | |
| *buf = '3'; | |
| break; | |
| case '4': | |
| job_simle(); | |
| *buf = '5'; | |
| break; | |
| case '6': | |
| job_bye(); | |
| *buf = '7'; | |
| break; | |
| default: | |
| break; | |
| } | |
| if (*buf == '8') | |
| { | |
| *buf = '9'; | |
| if (munmap(buf, 4096) == -1) | |
| { | |
| perror("munmap"); | |
| exit(1); | |
| } | |
| return; | |
| } | |
| sleep(1); | |
| } | |
| if (munmap(buf, 4096) == -1) | |
| { | |
| perror("munmap"); | |
| exit(1); | |
| } | |
| } |