LINUX.ORG.RU

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

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

вот, спросоня написал какую-то фигню, но тут кучка лишнего - я не писал с чистого листа, а просто исправил то, что было у тебя.
Только поудаляй лишний вывод и неиспользующиеся функции (wakeup, sleeptime и sigchail)

#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>

int f_in, fd, ppid, pid, N, M, count = 0;

void wakeup()			//
{
	signal(SIGALRM, wakeup);
	printf("Wake up!\n");
}

void sleeptime(int timeout)
{
	signal(SIGALRM, wakeup);
	alarm(timeout);
	pause();
}

void sigper(int n)
{
	char c;
printf("SIGNAL %d\n", n);
	if (n != SIGUSR1 && n != SIGALRM)
		return;

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
	kill(pid, SIGUSR1);
//	signal(SIGUSR1, sigper);
}

void sigchail(int n)
{
	write(f_in, "3", 1);
	kill(ppid, SIGCHLD);
//	signal(SIGUSR1, sigchail);
}

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

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

	ppid = getpid();
	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");
		return 1;
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N)
				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);
}


p.s. ща меня закидают кучкой гнилых помидор и смачных какашек, но ты почитывай, там наверняка будут и полезные отзывы - это ЛОР, детка ;)

p.p.s. и не обижайся на местную братию, так-то они белые и пушистые :))

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

вот, спросоня написал какую-то фигню, но тут кучка лишнего - я не писал с чистого листа, а просто исправил то, что было у тебя.
Только поудаляй лишний вывод и неиспользующиеся функции (wakeup, sleeptime и sigchail)

#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>

int f_in, fd, ppid, pid, N, M, count = 0;

void wakeup()			//
{
	signal(SIGALRM, wakeup);
	printf("Wake up!\n");
}

void sleeptime(int timeout)
{
	signal(SIGALRM, wakeup);
	alarm(timeout);
	pause();
}

void sigper(int n)
{
	char c;
printf("SIGNAL %d\n", n);
	if (n != SIGUSR1 && n != SIGALRM)
		return;

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
	kill(pid, SIGUSR1);
//	signal(SIGUSR1, sigper);
}

void sigchail(int n)
{
	write(f_in, "3", 1);
	kill(ppid, SIGCHLD);
//	signal(SIGUSR1, sigchail);
}

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

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

	ppid = getpid();
	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");
		return 1;
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N)
				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);
}


p.s. ща меня закидают кучкой гнилых помидор и смачных какашек, но ты почитывай - там наверняка будут и полезные отзывы - это ЛОР, детка ;)

p.p.s. и не обижайся на местную братию, так-то они белые и пушистые :))

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

вот, спросоня написал какую-то фигню, но тут кучка лишнего - я не писал с чистого листа, а просто исправил то, что было у тебя.
Только поудаляй лишний вывод и неиспользующиеся функции (wakeup, sleeptime и sigchail)

#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>

int f_in, fd, ppid, pid, N, M, count = 0;

void wakeup()			//
{
	signal(SIGALRM, wakeup);
	printf("Wake up!\n");
}

void sleeptime(int timeout)
{
	signal(SIGALRM, wakeup);
	alarm(timeout);
	pause();
}

void sigper(int n)
{
	char c;
printf("SIGNAL %d\n", n);
	while (n != SIGUSR1 && n != SIGALRM)
		pause();

	while (read(f_in, &c, 1) == 1)
		write(1, &c, 1);
	kill(pid, SIGUSR1);
//	signal(SIGUSR1, sigper);
}

void sigchail(int n)
{
	write(f_in, "3", 1);
	kill(ppid, SIGCHLD);
//	signal(SIGUSR1, sigchail);
}

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

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

	ppid = getpid();
	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");
		return 1;
	} else if (pid == 0) {
		do {
			ret = read(0, &inp, 1);
			if (inp == '\n' || ret <= 0)
				break;
			if (i < N)
				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);
}


p.s. ща меня закидают кучкой гнилых помидор и смачных какашек, но ты почитывай - там наверняка будут и полезные отзывы - это ЛОР, детка ;)

p.p.s. и не обижайся на местную братию, так-то они белые и пушистые :))