История изменений
Исправление 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. и не обижайся на местную братию, так-то они белые и пушистые :))