コード例 #1
0
ファイル: superpoll_tests.c プロジェクト: bnoordhuis/mongrel2
char *run_test(int nr, int threads, int gens, int hot, char *fail_msg)
{
    debug("TEST IS: %s", fail_msg);

	struct timeval stv, etv;
	long long usecs, passes_per_sec;
    int rc = 0;
    FILE *perf = NULL;

    check(nr >= threads, "You can't have the nr less than threads.");

	max_threads = threads;
	max_generation = gens;

    perf = fopen("tests/perf.log", "a+");
    check(perf, "Failed to open tests/perf.log");
    pid_t mypid = getpid();


    fprintf(perf, "%s %d %d %d %ld %d ", hot ? "poll" : "epoll",
            mypid, nr, max_threads, max_generation, BUFSIZE);


	makepipes(nr, hot);

	send_pending_tokes();

	gettimeofday(&stv, NULL);

	seedthreads(max_threads);

    rc = run_main_loop(hot);
    check(rc == 0, "Looks like the main loop failed for '%s'", fail_msg);

	gettimeofday(&etv, NULL);

	etv.tv_sec -= stv.tv_sec;
	etv.tv_usec -= stv.tv_usec;

	if (etv.tv_usec < 0) {
		etv.tv_usec += 1000000;
		etv.tv_sec -= 1;
	}

    fprintf(perf, "%ld %ld.%06ld ", nr_token_passes, etv.tv_sec, (long int)etv.tv_usec);

	usecs = etv.tv_usec + etv.tv_sec * 1000000LL;
    if(usecs == 0) usecs++; // avoid divide-by-zero on some computers
	passes_per_sec = nr_token_passes * 1000000LL * 100;
	passes_per_sec /= usecs ;

    fprintf(perf, "%Ld.%02Ld\n", passes_per_sec / 100, passes_per_sec % 100);

    closepipes(nr);
    fclose(perf);

	return NULL;

error:
    closepipes(nr);
    if(perf) fclose(perf);
    return fail_msg;
}
コード例 #2
0
ファイル: qmail-start.c プロジェクト: kp-org/eQmail
int main(int argc,char **argv)
{
  if (chdir("/") == -1) die(errno);
  umask(077);
  if (prot_gid(auto_gidq) == -1) die(errno);

  if (fd_copy(2,0) == -1) die(errno);
  if (fd_copy(3,0) == -1) die(errno);
  if (fd_copy(4,0) == -1) die(errno);
  if (fd_copy(5,0) == -1) die(errno);
  if (fd_copy(6,0) == -1) die(errno);

  if (argv[1]) {
    qlargs[1] = argv[1];
    ++argv;
  }

  if (argv[1]) {
    if (pipe(pi0) == -1) die(errno);
    switch(fork()) {
      case -1: die(errno);
      case 0:
        if (prot_gid(auto_gidn) == -1) die(errno);
        if (prot_uid(auto_uidl) == -1) die(errno);
        close(pi0[1]);
        if (fd_move(0,pi0[0]) == -1) die(errno);
        close23456();
        execvp(argv[1],argv + 1);
    die(errno);
    }
    close(pi0[0]);
    if (fd_move(1,pi0[1]) == -1) die(errno);
  }

  if (pipe(pi1) == -1) die(errno);
  if (pipe(pi2) == -1) die(errno);
  if (pipe(pi3) == -1) die(errno);
  if (pipe(pi4) == -1) die(errno);
  if (pipe(pi5) == -1) die(errno);
  if (pipe(pi6) == -1) die(errno);

  /* start qmail-lspawn */
  switch(fork()) {
    case -1: die(errno);
    case 0:
      if (fd_copy(0,pi1[0]) == -1) die(errno);
      if (fd_copy(1,pi2[1]) == -1) die(errno);
      close23456();
      closepipes();
      execvp(*qlargs,qlargs);
      die(errno);
  }

  /* start qmail-rspawn */
  switch(fork()) {
    case -1: die(errno);
    case 0:
      if (prot_uid(auto_uidr) == -1) die(errno);
      if (fd_copy(0,pi3[0]) == -1) die(errno);
      if (fd_copy(1,pi4[1]) == -1) die(errno);
      close23456();
      closepipes();
      execvp(*qrargs,qrargs);
      die(errno);
  }

  /* start qmail-clean */
  switch(fork()) {
    case -1: die(errno);
    case 0:
      if (prot_uid(auto_uidq) == -1) die(errno);
      if (fd_copy(0,pi5[0]) == -1) die(errno);
      if (fd_copy(1,pi6[1]) == -1) die(errno);
      close23456();
      closepipes();
      execvp(*qcargs,qcargs);
      die(errno);
  }

  if (prot_uid(auto_uids) == -1) die(errno);
  if (fd_copy(0,1) == -1) die(errno);
  if (fd_copy(1,pi1[1]) == -1) die(errno);
  if (fd_copy(2,pi2[0]) == -1) die(errno);
  if (fd_copy(3,pi3[1]) == -1) die(errno);
  if (fd_copy(4,pi4[0]) == -1) die(errno);
  if (fd_copy(5,pi5[1]) == -1) die(errno);
  if (fd_copy(6,pi6[0]) == -1) die(errno);
  closepipes();
  execvp(*qsargs,qsargs);  /* start qmail-send */
  die(errno);
  return(0);  /* never reached */
}
コード例 #3
0
ファイル: myshell.c プロジェクト: rlyspn/os_shell
void execline(programlist *pgl, path *pth)
{
	/*printf("\n\n\n====\n\n\n"); */
	int i;

	/* set up pipes/filters */
	/*int filterfd[2]; */
	int **filterfds;
	int pipecnt = pgl->count - 1;
	if (pipecnt > 0) {
		filterfds = (int **)malloc(sizeof(int *) * pipecnt);
		if (filterfds == NULL) {
			/*printf("failed to malloc filterfds\n"); */
			exit(1);
		}

		for (i = 0; i < pipecnt; i++) {
			filterfds[i] = (int *)malloc(sizeof(int) * 2);
			if (filterfds[i] == NULL) {
				/*printf("failed to malloc pipe\n"); */
				exit(1);
			}
			if (pipe(filterfds[i]) == -1) {
				/*printf("failed to create pipe. i = %d, err= %d\n", i, errno); */
			}
			/*printf("in = %d, out = %d\n", filterfds[i][0], filterfds[i][1]); */

		}
	}

	/*set up standard in/out */
	int infd, outfd, errfd;
	if (pgl->in != NULL) {
		//infd = setstd(pgl->in, 0, stdin);
		infd = setstdin(pgl->in);
	}
	if (pgl->out != NULL) {
		/*printf("setting out\n=====\n"); */
		outfd = setstd(pgl->out, 1, stdout);
	}
	if (pgl->err != NULL) {
		errfd = setstd(pgl->err, 2, stderr);
	}

	/*set up commands */
	program **programs;
	programs = (program **)malloc(sizeof(program *) * pgl->count);
	if (programs == NULL) {
		exit(1);
	}
	program *crntprg;
	crntprg = pgl->tail;
	for (i = 0; i < pgl->count; i++) {
		programs[i] = (program *)malloc(sizeof(program));
		if (programs[i] == NULL) {
			fprintf(stderr, "failed to malloc\n");
			exit(1);
		}
		programs[i] = crntprg;
		crntprg = crntprg->prev;
	}

	char ***execs;
	execs = (char ***)malloc(sizeof(char **) * pgl->count);
	if (execs == NULL) {
		fprintf(stderr, "Failed to mallocs execs");
		exit(1);
	}
	memset(execs, 0, pgl->count);
	//printf("pgl count = %d\n", pgl->count);
	for (i = 0; i < pgl->count; i++) {
		execs[i] = createcmd(programs[i], pth);
		//printf("exec[i] = %s\n", execs[i][0]);
		if (execs[i] == NULL) {
			printf("Failed to find cmd: %s\n", programs[i]->cmd);
			exit(1);
		}
	}
	free(programs);

	for (i = 0; i < pgl->count; i++) {
		/* Set in for the command as a pipe. */
		pid_t child;
		child = fork();
		if (child == 0) {
			/*printf("My parent is %d\n", getppid()); */
			if (i == 0 && pgl->filtered == 1) {
				//printf("setting pipe1\n");
				/*last in list, don't set stdout, only in */
				dup2(filterfds[i][0], STDIN_FILENO);
			} else if (i == pgl->count - 1 && pgl->filtered == 1) {
				//printf("setting pipe2\n");
				/*first in list dont set in, only out */
				dup2(filterfds[i - 1][1], STDOUT_FILENO);
			} else if (pgl->filtered == 1) {
				//printf("setting pipe3\n");
				dup2(filterfds[i - 1][1], STDOUT_FILENO);
				dup2(filterfds[i][0], STDIN_FILENO);
			}
			if (closepipes(filterfds, pipecnt) == -1) {
				/*printf("Failed to close pipe\n"); */
				exit(1);
			}

			if (execv(execs[i][0], execs[i]) == -1) {
				/*printf("Failed to execute\n"); */
				exit(1);
			}

			exit(0);
		} else {
			continue;
		}
	}
	if (closepipes(filterfds, pipecnt) == -1) {
		/*printf("parent failed to close pipes\n"); */
		exit(1);
	}
	int status;
	for (i = 0; i < pgl->count; i++) {
		wait(&status);
		/*printf("\ti = %d, wait = %d\n", pgl->count, wait(&status)); */
	}

	if (pgl->in != NULL && infd != -1) {
		infd = resetstd(infd, 0, stdin);
	}
	if (pgl->out != NULL && outfd != -1) {
		outfd = resetstd(outfd, 1, stdout);
	}
	if (pgl->err != NULL && errfd != -1) {
		errfd = resetstd(errfd, 2, stderr);
	}

	//clean up pipes
	cleanuppipes(filterfds, pipecnt);
	//clean up execs
	cleanupexecs(execs, pgl);
	

	exit(0);
}