#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#define SHARE_RFIFO_PATH "/home/tmp/_fifo"
#define SHARE_WFIFO_PATH "/home/tmp/_fifo"
int nr_process = 4;
int fifo_create()
{
int i,j,ret;
int count = 0;
char rpath[64], wpath[64];
for(i=0; i<nr_process; i++) {
for(j=i+1; j<nr_process; j++) {
sprintf(rpath, "%s%d_%d", SHARE_RFIFO_PATH, i, j);
ret = mkfifo(rpath, S_IFIFO|0666);
if(ret < 0) {
perror("mkfifo rfifo");
return -1;
}
sprintf(wpath, "%s%d_%d", SHARE_WFIFO_PATH, j, i);
ret = mkfifo(wpath, S_IFIFO|0666);
if(ret < 0) {
perror("mkfifo wfifo");
return -1;
}
count += 2;
}
}
printf("[main]: create fifos success, total %d\n", count);
return 0;
}
int fifo_cleanup()
{
int ret;
ret = system("rm -rf /home/tmp/*fifo*");
return ret;
}
int main(int argc, char **argv)
{
int i,j, status;
int cpu_num;
int testloop = 8000;
int pid[1024];
if(argc < 2) {
printf("Usage: ./fifo3-main ./fifo3 4 10000\n");
return 0;
}
cpu_num = sysconf(_SC_NPROCESSORS_ONLN);
if(argc > 2) {
nr_process = atoi(argv[2]);
if(nr_process > cpu_num-2) {
printf("max process is %d!\n", cpu_num-2);
return -1;
}
}
if(argc > 3) {
testloop = atoi(argv[3]);
}
if(argc > 4) {
}
printf("pid %d, nr_process %d, testloop %d\n", getpid(), nr_process, testloop);
if(fifo_cleanup() < 0) {
printf("[main] fifo_cleanup error, exit!\n");
return -1;
}
if(fifo_create() < 0) {
printf("[main] fifo_create error, exit!\n");
return -1;
}
system("rm -rf /dev/shm/tmp_barrier*");
for(i=0; i<nr_process; i++) {
pid[i] = fork();
if(pid[i] < 0) {
perror("fork error");
return -1;
}
if(pid[i] == 0) {
char *newargv[] = { NULL, NULL, NULL, NULL, NULL, NULL,NULL};
char *newenviron[] = { "PATH=/bin", "/sbin",NULL};
char id[16] = {0};
sprintf(id, "%d", i);
newargv[0] = argv[1];
newargv[1] = id;
for(j=2; j<sizeof(newargv)/sizeof(char*)-1; j++) {
newargv[j] = argv[j];
//printf("newargv[%d]=%s\n", j, newargv[j]);
}
execve(argv[1], newargv, newenviron);
perror("execve");
exit(0);
}
}
for(i=0; i<nr_process; i++) {
if(waitpid(pid[i], &status, 0) < 0) {
perror("waitpid error");
}
}
return 0;
}