diff --git a/23217/s.ivchenko/lab10/10.c b/23217/s.ivchenko/lab10/10.c new file mode 100644 index 00000000..ec505963 --- /dev/null +++ b/23217/s.ivchenko/lab10/10.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include + + +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); + } + + } + +} \ No newline at end of file diff --git a/23217/s.ivchenko/lab18/18.c b/23217/s.ivchenko/lab18/18.c new file mode 100644 index 00000000..bfab865c --- /dev/null +++ b/23217/s.ivchenko/lab18/18.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 [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. diff --git a/23217/s.ivchenko/lab21/21.c b/23217/s.ivchenko/lab21/21.c new file mode 100644 index 00000000..3468349b --- /dev/null +++ b/23217/s.ivchenko/lab21/21.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +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(); + } + +} \ No newline at end of file diff --git a/23217/s.ivchenko/lab25/25.c b/23217/s.ivchenko/lab25/25.c new file mode 100644 index 00000000..0ce635b1 --- /dev/null +++ b/23217/s.ivchenko/lab25/25.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include + + +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; +} \ No newline at end of file