LINUX.ORG.RU

История изменений

Исправление metawishmaster, (текущая версия) :

пропускаю '\r' и escape-символ, который каким-то чудом оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\r' || inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай

Исправление metawishmaster, :

пропускаю '\r' и escape-символ, который каким-то чудов оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\r' || inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай

Исправление metawishmaster, :

пропускаю escape-символ, который каким-то чудов оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\r' || inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай

Исправление metawishmaster, :

пропускаю escape-символ, который каким-то чудов оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай

Исправление metawishmaster, :

пропускаю escape-символ, который каким-то чудов оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, fd, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай

Исходная версия metawishmaster, :

пропускаю escape-символ, который каким-то чудов оказывался в конце:

#include <stdio.h>
#include <signal.h>
#include <wait.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <ctype.h>

int f_in, fd, pid, N, M;

void sigper(int n)
{
	char c;

	if (n != SIGUSR1 && n != SIGALRM)
		return;

	printf("SIG%s\n", n == SIGUSR1 ? "USR1" : "ALRM");

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
}

int main(int argc, char *argv[])
{
	int i = 0;
	char inp;
	ssize_t ret;

	if (argc < 4) {
		printf("error: insuffucient arguments\n");
		return 1;
	}

	if ((f_in = open(argv[1], O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)) < 0) {
		printf("Can't open %s\n", argv[1]);
		return 1;
	}
	N = atoi(argv[2]);
	M = atoi(argv[3]);

	if ((pid = fork()) < 0) {
		printf("Can't fork\n");
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N && inp != 27) {
				write(f_in, &inp, 1);
				i++;
			}
		} while (ret > 0);
		lseek(f_in, 0, SEEK_SET);
		kill(pid, SIGUSR1);
	} else {
		signal(SIGUSR1, sigper);
		signal(SIGALRM, sigper);
		alarm(M);
		pause();
	}
	close(f_in);

	return (0);
}


надеюсь, все, но если будут вопросы - спрашивай