ar@cello ~ % gcc -o crayon crayon.c ar@cello ~ % cat crayon.c #include #include #include #include int main(int argc, char **argv) { int k, can = 0; int status = 0; pid_t pid; while (fscanf(stdin, "%d", &k) != EOF) { pid = fork(); if(pid < 0) { fprintf(stdout, "-1\n"); return can ? 35 : 0; } if(pid > 0) { fclose(stdin); wait(&status); if((WIFEXITED(status) && WEXITSTATUS(status) == 35) || WIFSIGNALED(status)) { return can ? 35 : 0; } printf("%d\n", k); return 0; } can += 1; } return 0; } ar@cello ~ % seq 1 20 | bash -c 'ulimit -u 20; exec ./crayon' -1 ar@cello ~ % seq 1 30 | bash -c 'ulimit -u 20; exec ./crayon' -1 ar@cello ~ % seq 1 34 | ./crayon | wc -l 34 ar@cello ~ %