Exemple #1
0
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);

}
Exemple #3
0
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;
}