Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lab25 23217 s.ivchenko #700

Open
wants to merge 5 commits into
base: kutalev/accepted
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions 23217/s.ivchenko/lab10/10.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/wait.h>


int main(int argc, char *argv[]) {

if (argc < 2) {
perror("Enter your arguments.\n");
return 1;
}
pid_t pid = fork();

if (pid < 0) {
perror("Fork failed");
return 1;
} else if (pid == 0) {
execvp(argv[1], argv + 1);
perror("Execvp failed");
return 1;
} else {
int status;
pid_t new_pid = wait(&status);

if (new_pid == -1) {
perror("Error with exit pid status");
return 1;
}

if (WIFEXITED(status)) {
int exit_code = WEXITSTATUS(status);
printf("Process was termenated by exit with code: %d\n", exit_code);
} else if (WIFSIGNALED(status)) {
int signal_number = WTERMSIG(status);
printf("Process was termenated by signal with number: %d\n", signal_number);
}

}

}
89 changes: 89 additions & 0 deletions 23217/s.ivchenko/lab18/18.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <string.h>

void print_file_info(const char *filepath) {
struct stat file_stat;
char type;
char permissions[10] = "---------";
struct passwd *pw;
struct group *gr;
char time_buf[20];
char size_buf[20] = "";

if (stat(filepath, &file_stat) == -1) {
perror(filepath);
return;
}

if (S_ISDIR(file_stat.st_mode)) {
type = 'd';
snprintf(size_buf, sizeof(size_buf), "%ld", file_stat.st_size);
} else if (S_ISREG(file_stat.st_mode)) {
type = '-';
snprintf(size_buf, sizeof(size_buf), "%ld", file_stat.st_size);
} else {
type = '?';
}

// определение прав доступа
if (file_stat.st_mode & S_IRUSR) permissions[0] = 'r';
if (file_stat.st_mode & S_IWUSR) permissions[1] = 'w';
if (file_stat.st_mode & S_IXUSR) permissions[2] = 'x';
if (file_stat.st_mode & S_IRGRP) permissions[3] = 'r';
if (file_stat.st_mode & S_IWGRP) permissions[4] = 'w';
if (file_stat.st_mode & S_IXGRP) permissions[5] = 'x';
if (file_stat.st_mode & S_IROTH) permissions[6] = 'r';
if (file_stat.st_mode & S_IWOTH) permissions[7] = 'w';
if (file_stat.st_mode & S_IXOTH) permissions[8] = 'x';

pw = getpwuid(file_stat.st_uid); // имя владельца
gr = getgrgid(file_stat.st_gid); // имя группы

// время последней модификации
strftime(time_buf, sizeof(time_buf), "%b %d %H:%M", localtime(&file_stat.st_mtime));

printf("%c%s %lu %s %s %s %s %s\n",
type, permissions, file_stat.st_nlink,
pw ? pw->pw_name : "?",
gr ? gr->gr_name : "?",
size_buf,
time_buf, filepath);
}

int main(int argc, char *argv[]) {
if (argc < 2) {
fprintf(stderr, "Usage: %s <file1> [file2 ...]\n", argv[0]);
return EXIT_FAILURE;
}

for (int i = 1; i < argc; i++) {
print_file_info(argv[i]);
}

return EXIT_SUCCESS;
}

// напишите программу - аналог команды ls -ld. Для каждого своего аргумента эта команда должна распечатывать:
// Биты состояния файла в воспринимаемой человеком форме:
// d если файл является каталогом
// - если файл является обычным файлом
// ? во всех остальных случаях
// Три группы символов, соответствующие правам доступа для хозяина, группы и всех остальных:
// r если файл доступен для чтения, иначе -
// w если файл доступен для записи, иначе -
// x если файл доступен для исполнения, иначе -
// Количество связей файла
// Имена собственника и группы файла (совет - используйте getpwuid и getgrgid).
// Если файл является обычным файлом, его размер. Иначе оставьте это поле пустым.
// Дату модификации файла (используйте mtime).
// Имя файла (если было задано имя с путем, нужно распечатать только имя).

// Желательно, чтобы поля имели постоянную ширину, т.е. чтобы листинг имел вид таблицы.
// Совет - используйте printf.
38 changes: 38 additions & 0 deletions 23217/s.ivchenko/lab21/21.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

int count = 0;

void handle_sigquit(int sig) {
char buffer[50];
int len = snprintf(buffer, sizeof(buffer), "\nСколько раз пропищало: %d\n", count);
write(STDOUT_FILENO, buffer, len);
exit(EXIT_SUCCESS);
}

void handle_sigint(int sig) {
write(STDOUT_FILENO, "\007", 1);
sleep(5);
count++;
signal(SIGINT, handle_sigint);
}

void main() {

if (signal(SIGINT, handle_sigint) == SIG_ERR) {
perror("Fail to set SIGINT handler");
exit(EXIT_FAILURE);
}

if (signal(SIGQUIT, handle_sigquit) == SIG_ERR) {
perror("Fail to set SIGQUIT handler");
exit(EXIT_FAILURE);
}

while (1) {
pause();
}

}
54 changes: 54 additions & 0 deletions 23217/s.ivchenko/lab25/25.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>


int main() {
char* string = "I'm just a simple English string";
int size = strlen(string) + 1;
int pipefd[2];

if(pipe(pipefd) == -1) {
fprintf(stderr, "Ошибка создания канала\n");
exit(1);
}

pid_t pid = fork();

if(pid < 0) {
perror("Ошибка запуска fork\n");
exit(1);
} else if (pid > 0) {
printf("pipefd[0] descriptor: %d, pipefd[1] descriptor: %d\n", pipefd[0], pipefd[1]);
close(pipefd[0]);
printf("Родительский процесс отправляет: %s\n", string);
if (write(pipefd[1], string, size) == -1) {
perror("Ошибка записи");
exit(1);
}
close(pipefd[1]);
} else {
close(pipefd[1]);
char getString[size];
char *str = getString;
if (read(pipefd[0], getString, size) == -1) {
perror("Ошибка чтения");
exit(1);
}
printf("Дочерний процесс отправляет: ");
ssize_t res;
while (res = read(pipefd[0], str, size) != 0){
str = str + res;
}
for(int i = 0; i < size - 1; i++) {
printf("%c", toupper(getString[i]));
}
printf("\n");
close(pipefd[0]);
}

return 0;
}