Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _GNU_SOURCE
- #include <sys/wait.h>
- #include <sys/types.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <stdlib.h>
- #include <unistd.h>
- enum
- {
- BUFF_SIZE = 1024 * 128
- };
- int
- main(int arc, char *argv[])
- {
- int count, mod;
- sscanf(argv[1], "%d", &count);
- sscanf(argv[2], "%d", &mod);
- int outpipe[2];
- pipe2(outpipe, O_CLOEXEC);
- if (!fork()) {
- int inpipe[2];
- pipe2(inpipe, O_CLOEXEC);
- if (!fork()) {
- dup2(inpipe[0], 0);
- dup2(outpipe[1], 1);
- execlp(argv[3], argv[3], NULL);
- }
- dup2(inpipe[1], 1);
- close(inpipe[0]);
- close(inpipe[1]);
- close(outpipe[0]);
- close(outpipe[1]);
- for (long long i = 1; i <= count; ++i) {
- printf("%d ", (int)((i * i) % mod));
- fflush(stdout);
- }
- close(1);
- wait(NULL);
- exit(0);
- }
- if (!fork()) {
- close(outpipe[1]);
- if (!fork()) {
- char buff[BUFF_SIZE];
- int sz;
- while ((sz = read(outpipe[0], buff, sizeof(buff))) != 0) {
- for (int i = 0; i < sz; ++i) {
- if (isspace(buff[i])) {
- printf("\n");
- }
- else {
- printf("%c", buff[i]);
- }
- }
- }
- exit(0);
- }
- close(outpipe[0]);
- wait(NULL);
- exit(0);
- }
- close(outpipe[0]);
- close(outpipe[1]);
- wait(NULL);
- wait(NULL);
- printf("0\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement