int main(int argc, char **argv){ int i; extern int process0(int n,int num); if (argc != 2){ fprintf(stderr, "usage: ring ringsize\nring size must be at least 2\n"); return 1; } int num = atoi(argv[1]); if (num < 2){ fprintf(stderr, "usage: ring ringsize\nring size must be at least 2\n"); return 1; } int ppid,pid,status,result; for (i = 0;i < (num -1); i ++){ if ((pid = fork()) == -1) { perror("fork"); exit(1); } } process0(0,num); return 0; }
int main(int argc, char *argv[]) { Tower *towers; int discsCount, towersCount, destTower; /* initialize MPI */ MPI_Init(&argc, &argv); /* find out process id */ MPI_Comm_rank(MPI_COMM_WORLD, &process_id); /* find out number of processes */ MPI_Comm_size(MPI_COMM_WORLD, &processors); printf("\nHello world from process %i", process_id); if (process_id == 0) { printf("Hello, I'm the master!"); // I'm the starting process // I have to read the data and let others take portions of it static const char filename[] = "enter.txt"; static const char discDelimiter[] = ","; FILE *file = fopen(filename, "r"); if (file != NULL) { char line[128]; /* max line size */ int i; fgets(line, sizeof line, file); sscanf(line, "%i", &discsCount); fgets(line, sizeof line, file); sscanf(line, "%i", &towersCount); fgets(line, sizeof line, file); sscanf(line, "%i", &destTower); printf("Towers of Hanoi: %i towers, %i discs, %i dest tower\n", towersCount, discsCount, destTower); towers = (Tower*) malloc (towersCount * sizeof(Tower)); for (i = 0; i < towersCount; i++) { char towerLine[128]; Tower tower = { 0, NULL }; char *disc; tower.number = i + 1; if (fgets(towerLine, sizeof towerLine, file) == NULL) { return 1; /* bad enter */ } printf("Created new tower: %i\n", tower.number); disc = strtok(towerLine, discDelimiter); while (1) { int discSize = 0; if (disc == NULL) { break; } sscanf(disc, "%i", &discSize); if (discSize == 0) { break; } insertDics(discSize, &tower); printf("Inserted disc of size: %i to tower %i\n", discSize, tower.number); disc = strtok(NULL, discDelimiter); } towers[i] = tower; } fclose(file); // initial work split int* inputData; inputData = (int*) malloc(3 * sizeof(*inputData)); inputData[0] = towersCount; inputData[1] = discsCount; inputData[2] = destTower; // send to all processors (except master) the basic calculation parameters for (i = 1; i < processors; i++) { MPI_Send(inputData, sizeof(*inputData), MPI_INT, i, MSG_INIT, MPI_COMM_WORLD); } free(inputData); //printState(towers, towersCount); process0(towers, towersCount, discsCount, destTower); //freeTowers(towers, &towersCount); } else { perror("enter.txt could not be opened"); return 1; } } else { // other processes (process_id > 0) } run(process_id, processors); }
int main(int argc, char *argv[]) { struct sockaddr_in ProxyAddr; struct sockaddr_in BrowserAddr; struct hostent *HostInfo; int opt; int httpNumber = 1; int portNumber; int bl = 1; /* bind()失敗対策 */ int clientSocket; int browserlength; char ipaddress[15]; if (argc != 4) { fprintf(stderr, "usage: ./proxy [-0][-1] [ipaddress] [port]\n"); exit(1); } /* オプションの取得*/ if((opt = getopt(argc,argv,"01")) != -1) { switch(opt) { case '0': printf("Select HTTP/1.0\n"); httpNumber = 0; break; case '1': printf("Select HTTP/1.1\n"); httpNumber = 1; break; default: printf("Please Select one of [-0][-1]\n"); exit(1); break; } } strcpy(ipaddress, argv[2]); portNumber = atoi(argv[3]); printf("Port Number: %d\n", portNumber); printf("IP address : %s\n", ipaddress); /* SIGINTにSigHandler()を,SIGCHLDにCatchChild()を登録 */ signal(SIGINT, SigHandler); signal(SIGCHLD, CatchChild); /* ブラウザとの通信用のソケットを作成 */ if ((ProxySocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Failed to make a Proxysocket!\n"); exit(1); } /* ホスト名を得る */ /*if ((HostInfo = gethostbyname("localhost")) == NULL) {*/ if ((HostInfo = gethostbyname(ipaddress)) == NULL) { fprintf(stderr, "Failed to find host!\n"); exit(1); } ProxyAddr.sin_family = AF_INET; ProxyAddr.sin_port = htons(portNumber); memcpy((char *)&ProxyAddr.sin_addr, (char *)HostInfo->h_addr_list[0], HostInfo->h_length); /* bind()失敗対策 */ setsockopt(ProxySocket, SOL_SOCKET, SO_REUSEADDR, (const char *)&bl, sizeof(bl)); /* IPアドレスとポート番号の設定 */ if (bind(ProxySocket, (struct sockaddr *)&ProxyAddr, sizeof(ProxyAddr)) == -1) { fprintf(stderr, "Failed to assign a name to the Proxysocket!\n"); exit(1); } /* listen */ if (listen(ProxySocket, 5) == -1) { fprintf(stderr, "Failed to listen ProxySocket!\n"); exit(1); } /* ブラウザから要求があったらプロセスを作成するループ */ while (1) { int pid; /* プロセスの作成 */ struct timeval waitval; /* タイムアウト */ fd_set rfds; /* select()に必要 */ /* 監視対象をセット */ FD_ZERO(&rfds); FD_SET(ProxySocket, &rfds); /* 監視のタイムアウトの時間を設定 */ waitval.tv_sec = 5; waitval.tv_usec = 0; if (select(ProxySocket+1, &rfds, NULL, NULL, &waitval) <= 0) { continue; /* select()に失敗するとwhile文をやり直す */ } /* clientSocketをプロセスに渡す */ if (FD_ISSET(ProxySocket, &rfds)) { /* ブラウザからの接続要求をaccept() */ browserlength = sizeof(BrowserAddr); if ((clientSocket = accept(ProxySocket, (struct sockaddr *)&BrowserAddr, (socklen_t *)&browserlength)) == -1) { fprintf(stderr, "Failed to accept clientSocket!\n"); exit(1); } pid = fork(); /* プロセスの作成 */ if (pid == 0) { #if defined(DEBUG) printf("子プロセス開始.\n"); #endif /* 子プロセス */ if(httpNumber == 0) process0(clientSocket); if(httpNumber == 1) process1(clientSocket, ipaddress); } else if (pid > 0) { /* fork()失敗 */ close(clientSocket); } else { /* アクセプトソケットクローズ */ close(clientSocket); #if defined(DEBUG) printf("ブラウザのソケットを閉じました.\n"); #endif } /* 親プロセス処理なし */ } } return 0; }