瀏覽代碼

feat: add process

otter 2 周之前
父節點
當前提交
5017960350
共有 9 個文件被更改,包括 231 次插入3 次删除
  1. 二進制
      LinuxProcesses/a.out
  2. 1 0
      LinuxProcesses/coefficients.txt
  3. 二進制
      LinuxProcesses/process
  4. 211 0
      LinuxProcesses/process.c
  5. 1 0
      LinuxProcesses/result.txt
  6. 二進制
      Signals/a.out
  7. 二進制
      Signals/main
  8. 3 3
      Signals/signal.c
  9. 15 0
      Signals/signal2.c

二進制
LinuxProcesses/a.out


+ 1 - 0
LinuxProcesses/coefficients.txt

@@ -0,0 +1 @@
+4 12 9

二進制
LinuxProcesses/process


+ 211 - 0
LinuxProcesses/process.c

@@ -0,0 +1,211 @@
+#define _CRT_SECURE_NO_WARNINGS
+#include <stdio.h>
+#include <math.h>
+#include <malloc.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>	  //работа с файлами
+#include <unistd.h>	  // закрытие файла
+#include <sys/stat.h> //S_IRWXU
+#include <sys/wait.h> //wait
+
+double *getCoeff(int start, int end, char *arr)
+{
+	double *coeff = malloc(sizeof(double));
+	*coeff = 0;
+	int znak = 1, drob = 0, step = 0;
+	if (arr[start] == '-')
+	{
+		znak = -1;
+		start++;
+	}
+	for (int k = start; k < end; k++)
+	{
+		if ((arr[k] >= '0' && arr[k] <= '9') || arr[k] == '.')
+		{
+			if (drob == 0 && arr[k] == '.')
+				drob = 1;
+			else if (arr[k] >= '0' && arr[k] <= '9')
+			{
+				if (drob == 0)
+				{
+					*coeff = (*coeff * pow(10, step)) + (arr[k] - '0');
+					step++;
+				}
+				else
+				{
+					*coeff += (arr[k] - '0') / pow(10, drob);
+					drob++;
+				}
+			}
+			else
+				return NULL;
+		}
+		else
+			return NULL;
+	}
+	*coeff = *coeff * znak;
+	return coeff;
+}
+
+double *readFile(char *name)
+{
+	int file = open(name, O_RDONLY); // Открытие файла только для чтения NULL
+	if (file == -1)
+	{
+		printf("Ошибка чтения файла");
+	}
+	else
+	{
+		struct stat buf; //структура из файла stat.h
+		fstat(file, &buf);
+		int size = buf.st_size;
+		char *arr = malloc(size * sizeof(char));
+		read(file, arr, size);
+		close(file);
+		double *coeff = malloc(3 * sizeof(double));
+		int countSpace = 0;
+		int *index = malloc(size * sizeof(int));
+		for (int i = 0; i < size; i++)
+		{
+			if (arr[i] == ' ')
+			{
+				countSpace++;
+				index = realloc(index, countSpace * sizeof(int));
+				index[countSpace - 1] = i;
+			}
+		}
+		if (countSpace > 2)
+			return NULL;
+		int startIndex = 0; // начинается с 0, далее - все ячейки после пробела
+		double *pointer;
+		for (int i = 0; i < countSpace; i++)
+		{
+			pointer = getCoeff(startIndex, index[i], arr);
+			startIndex = index[i] + 1;
+			if (pointer)
+				coeff[i] = *pointer;
+			else
+				return NULL;
+		}
+		pointer = getCoeff(startIndex, size, arr);
+		if (pointer)
+			coeff[countSpace] = *pointer;
+		else
+			return NULL;
+		return coeff;
+	}
+}
+
+int error(char *name)
+{
+	int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU); // Создать файл на чтение и запись и стереть данные если существует
+	char *message = "Файл содержит символы или другие некорректные данные";
+	write(file, message, strlen(message));
+	close(file);
+	return 0;
+}
+
+int writeRootsToFile(char *name, double a, double b, double c)
+{ 
+	int file = open(name, O_RDWR | O_CREAT | O_TRUNC, S_IRWXU);
+	char* message = malloc(50);
+	int countRoot = 0;
+	if (a == 0) // проверка корректности
+	{
+		if (b == 0)
+		{
+			if (c == 0)
+				message = "Уравнение имеет бесконечно много решений.";
+			else
+				message = "Уравнение не имеет решений.";
+		}
+		else
+		{
+			double x = -c / b; // Линейное уравнение
+			sprintf(message, "Уравнение имеет одно решение: x = %.2lf", x);	
+			countRoot = 1;
+		}
+	}
+	else
+	{
+		double D = pow(b, 2) - (double)4 * a * c;
+		if (D >= 0)
+		{
+			if (D == 0)
+			{
+				double x = (-b) / (2 * a);
+				sprintf(message, "Корень один: %0.2lf", x);
+				countRoot = 1;
+			}
+			else
+			{
+				double x1 = (-b + sqrt(D)) / (2 * a);
+				double x2 = (-b - sqrt(D)) / (2 * a);
+				sprintf(message, "Корни уравнения: %0.2lf, %0.2lf", x1, x2);
+				countRoot = 2;
+			}
+		}
+		else message = "Корней нет";
+	}
+	write(file, message, strlen(message));
+	close(file);
+	switch (countRoot)
+	{
+		case 0: exit(0);
+		case 1: exit(1);
+		case 2: exit(2);
+		default: exit(-1); 
+	}
+}
+
+char *readFileResult(char *name)
+{
+	int file = open(name, O_RDONLY);
+	if (file == -1) printf("Ошибка чтения файла результата");
+	else
+	{
+		struct stat buf;
+		fstat(file, &buf);
+		int size = buf.st_size;
+		char *arr = malloc(size * sizeof(char));
+		read(file, arr, size);
+		close(file);
+		return arr;
+	}
+}
+
+int main()
+{
+	printf("Родитель %d считывает информацию\n", getpid()); 
+	char *fileResult = "result.txt";
+	double *arr = readFile("coefficients.txt");
+	int status;
+	char* show;
+	switch (fork())
+	{
+		case -1: exit(-1); break; //ошибка   
+		case 0: //выполняется у дочернего процесса
+		printf("Ребенок %d записывает ответ в файл\n", getpid()); 
+		if (arr)
+			writeRootsToFile(fileResult, arr[0], arr[1], arr[2]);
+		else
+			error(fileResult);
+		break;   
+	}
+	wait(&status); //Ожидание завершения дочернего процесса
+	switch (status)
+	{
+		case 0: printf("Корней нет\n"); break;
+		case 1:
+		show = readFileResult(fileResult);
+		printf("%s", show);
+		break;
+		case 2:
+		show = readFileResult(fileResult);
+		printf("%s", show);
+		break;
+		default: printf("Что-то пошло не так\n"); break;   
+	}
+	return 0;
+}

+ 1 - 0
LinuxProcesses/result.txt

@@ -0,0 +1 @@
+Корень один: -1.50

二進制
Signals/a.out


二進制
Signals/main


+ 3 - 3
Signals/main.c → Signals/signal.c

@@ -10,10 +10,10 @@ void handlerSign(int sig)
     switch (sig)
     {
         case SIGINT: printf("Не мешай мне работать\n"); 
-        //signal(SIGINT, SIG_DFL);
+        signal(SIGINT, SIG_DFL); //возвращение исходной диспозиции сигнала
         break;
         case SIGQUIT: printf("Тебе не прервать меня\n"); 
-        //signal(SIGQUIT, SIG_DFL);
+        signal(SIGQUIT, SIG_DFL);
         break;
     }
 }
@@ -24,7 +24,7 @@ int main()
     signal(SIGQUIT, handlerSign);
     while (1) 
     {
-        printf("Я работаю\n"); 
+        printf("Я работаю %d\n", getpid()); 
         sleep(1);
     }
 	return 0;

+ 15 - 0
Signals/signal2.c

@@ -0,0 +1,15 @@
+#define _CRT_SECURE_NO_WARNINGS
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h> //sleep
+#include <signal.h> //сигналы
+
+int main()
+{ 
+    int sign;
+    printf("Введите id процесса: "); 
+    scanf("%d", &sign);
+    kill(sign, SIGINT);
+	return 0;
+}