From e24502699b6565866402cde2574dd3fc444199f8 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Fri, 3 Nov 2023 15:02:03 +0300 Subject: [PATCH] restart rep --- HW/main.c | 80 ++++++++++++ Practice/04.10/output/mykey | 0 Practice/04.10/output/mykey2 | 0 Practice/04.10/output/semget | Bin 0 -> 70808 bytes Practice/04.10/semget.c | 52 ++++++++ Practice/04.10/shmat/svshm_string.h | 26 ++++ Practice/04.10/shmat/svshm_string_read.c | 62 +++++++++ Practice/04.10/shmat/svshm_string_write.c | 53 ++++++++ Practice/29.09/code.c | 147 ++++++++++++++++++++++ Practice/matrix/Makefile | 9 ++ Practice/matrix/func.c | 38 ++++++ Practice/matrix/func.h | 15 +++ Practice/matrix/main.c | 77 ++++++++++++ Practice/matrix/matrix_app | Bin 0 -> 16712 bytes Practice/sock20.10.23/c3.c | 91 ++++++++++++++ Practice/sock20.10.23/c4.c | 142 +++++++++++++++++++++ Practice/sock20.10.23/s3.c | 106 ++++++++++++++++ Practice/sock20.10.23/s4.c | 142 +++++++++++++++++++++ Practice/trash/app | Bin 0 -> 16248 bytes Practice/trash/app_poll | Bin 0 -> 16992 bytes Practice/trash/child.c | 86 +++++++++++++ Practice/trash/done | 2 + Practice/trash/lect.c | 24 ++++ Practice/trash/pin.c | 74 +++++++++++ Practice/trash/poll.c | 133 ++++++++++++++++++++ Practice/trash/poll2.c | 142 +++++++++++++++++++++ Practice/trash/prog1 | 37 ++++++ Practice/trash/text | 2 + 28 files changed, 1540 insertions(+) create mode 100644 HW/main.c create mode 100644 Practice/04.10/output/mykey create mode 100644 Practice/04.10/output/mykey2 create mode 100755 Practice/04.10/output/semget create mode 100644 Practice/04.10/semget.c create mode 100644 Practice/04.10/shmat/svshm_string.h create mode 100644 Practice/04.10/shmat/svshm_string_read.c create mode 100644 Practice/04.10/shmat/svshm_string_write.c create mode 100644 Practice/29.09/code.c create mode 100644 Practice/matrix/Makefile create mode 100644 Practice/matrix/func.c create mode 100644 Practice/matrix/func.h create mode 100644 Practice/matrix/main.c create mode 100755 Practice/matrix/matrix_app create mode 100644 Practice/sock20.10.23/c3.c create mode 100644 Practice/sock20.10.23/c4.c create mode 100644 Practice/sock20.10.23/s3.c create mode 100644 Practice/sock20.10.23/s4.c create mode 100755 Practice/trash/app create mode 100755 Practice/trash/app_poll create mode 100644 Practice/trash/child.c create mode 100644 Practice/trash/done create mode 100644 Practice/trash/lect.c create mode 100644 Practice/trash/pin.c create mode 100644 Practice/trash/poll.c create mode 100644 Practice/trash/poll2.c create mode 100644 Practice/trash/prog1 create mode 100644 Practice/trash/text diff --git a/HW/main.c b/HW/main.c new file mode 100644 index 0000000..5548adb --- /dev/null +++ b/HW/main.c @@ -0,0 +1,80 @@ + +#include +#include +#include +#include + +#define SIZE 100 + +void matrixMultiply(int matrix1[SIZE][SIZE], int matrix2[SIZE][SIZE], int result[SIZE][SIZE], int n) { + int i, j, k; + for (i = 0; i < n; i++) { + for (j = 0; j < n; j++) { + result[i][j] = 0; + for (k = 0; k < n; k++) { + result[i][j] += matrix1[i][k] * matrix2[k][j]; + } + } + } +} + +int main() { + char* file1 = "matrix1.txt"; // Имя файла для первой матрицы + char* file2 = "matrix2.txt"; // Имя файла для второй матрицы + char* fileResult = "result_matrix.txt"; // Имя файла для результирующей матрицы + + int matrix1[SIZE][SIZE], matrix2[SIZE][SIZE], result[SIZE][SIZE]; // Матрицы + + // Открываем файл первой матрицы + int fd1 = open(file1, O_RDONLY); + if (fd1 == -1) { + perror("Не удалось открыть файл для первой матрицы"); + exit(1); + } + + // Считываем данные первой матрицы из файла + int bytesRead = read(fd1, matrix1, sizeof(int) * SIZE * SIZE); + if (bytesRead == -1) { + perror("Ошибка при чтении первой матрицы"); + exit(1); + } + close(fd1); // Закрываем файл + + // Открываем файл второй матрицы + int fd2 = open(file2, O_RDONLY); + if (fd2 == -1) { + perror("Не удалось открыть файл для второй матрицы"); + exit(1); + } + + // Считываем данные второй матрицы из файла + bytesRead = read(fd2, matrix2, sizeof(int) * SIZE * SIZE); + if (bytesRead == -1) { + perror("Ошибка при чтении второй матрицы"); + exit(1); + } + close(fd2); // Закрываем файл + + int n = bytesRead / (sizeof(int) * SIZE); // Размер матрицы + + matrixMultiply(matrix1, matrix2, result, n); // Выполняем умножение матриц + + // Открываем файл для результирующей матрицы + int fdResult = open(fileResult, O_WRONLY | O_CREAT | O_TRUNC); + if (fdResult == -1) { + perror("Не удалось открыть файл для результирующей матрицы"); + exit(1); + } + + // Записываем результирующую матрицу в файл + int bytesWritten = write(fdResult, result, sizeof(int) * n * n); + if (bytesWritten == -1) { + perror("Ошибка при записи результирующей матрицы"); + exit(1); + } + close(fdResult); // Закрываем файл + + printf("Результирующая матрица успешно записана в файл '%s'\n", fileResult); + + return 0; +} diff --git a/Practice/04.10/output/mykey b/Practice/04.10/output/mykey new file mode 100644 index 0000000..e69de29 diff --git a/Practice/04.10/output/mykey2 b/Practice/04.10/output/mykey2 new file mode 100644 index 0000000..e69de29 diff --git a/Practice/04.10/output/semget b/Practice/04.10/output/semget new file mode 100755 index 0000000000000000000000000000000000000000..bac4751512959ddea3a9d9498fe212e71cc0dd10 GIT binary patch literal 70808 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 Wp~`jr6q-W5W_o$>wFS&oB2zvWp|Qo4&iN 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 + #include + #include + #include + #include + + static void + usage(const char *pname) + { + fprintf(stderr, "Usage: %s [-cx] pathname proj-id num-sems\n", + pname); + fprintf(stderr, " -c Use IPC_CREAT flag\n"); + fprintf(stderr, " -x Use IPC_EXCL flag\n"); + exit(EXIT_FAILURE); + } + + int + main(int argc, char *argv[]) + { + int semid, nsems, flags, opt; + key_t key; + + flags = 0; + while ((opt = getopt(argc, argv, "cx")) != -1) { + switch (opt) { + case 'c': flags |= IPC_CREAT; break; + case 'x': flags |= IPC_EXCL; break; + default: usage(argv[0]); + } + } + + if (argc != optind + 3) + usage(argv[0]); + + key = ftok(argv[optind], argv[optind + 1][0]); + if (key == -1) { + perror("ftok"); + exit(EXIT_FAILURE); + } + + nsems = atoi(argv[optind + 2]); + + semid = semget(key, nsems, flags | 0600); + if (semid == -1) { + perror("semget"); + exit(EXIT_FAILURE); + } + + printf("ID = %d\n", semid); + + exit(EXIT_SUCCESS); + } diff --git a/Practice/04.10/shmat/svshm_string.h b/Practice/04.10/shmat/svshm_string.h new file mode 100644 index 0000000..3ee6af9 --- /dev/null +++ b/Practice/04.10/shmat/svshm_string.h @@ -0,0 +1,26 @@ +#include +#include +#include +#include +#include +#include +#include + +#define errExit(msg) \ + do \ + { \ + perror(msg); \ + exit(EXIT_FAILURE); \ + } while (0) + +union semun +{ /* Used in calls to semctl() */ + int val; + struct semid_ds *buf; + unsigned short *array; +#if defined(__linux__) + struct seminfo *__buf; +#endif +}; + +#define MEM_SIZE 4096 diff --git a/Practice/04.10/shmat/svshm_string_read.c b/Practice/04.10/shmat/svshm_string_read.c new file mode 100644 index 0000000..ae6f182 --- /dev/null +++ b/Practice/04.10/shmat/svshm_string_read.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include + +#include "svshm_string.h" + +int main(void) +{ + int semid, shmid; + char *addr; + union semun arg, dummy; + struct sembuf sop; + + /* Create shared memory and semaphore set containing one + semaphore. */ + + shmid = shmget(IPC_PRIVATE, MEM_SIZE, IPC_CREAT | 0600); + if (shmid == -1) + errExit("shmget"); + + semid = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600); + if (semid == -1) + errExit("semget"); + + /* Attach shared memory into our address space. */ + + addr = shmat(shmid, NULL, SHM_RDONLY); + if (addr == (void *)-1) + errExit("shmat"); + + /* Initialize semaphore 0 in set with value 1. */ + + arg.val = 1; + if (semctl(semid, 0, SETVAL, arg) == -1) + errExit("semctl"); + + printf("shmid = %d; semid = %d\n", shmid, semid); + + /* Wait for semaphore value to become 0. */ + + sop.sem_num = 0; + sop.sem_op = 0; + sop.sem_flg = 0; + + if (semop(semid, &sop, 1) == -1) + errExit("semop"); + + /* Print the string from shared memory. */ + + printf("%s\n", addr); + + /* Remove shared memory and semaphore set. */ + + if (shmctl(shmid, IPC_RMID, NULL) == -1) + errExit("shmctl"); + if (semctl(semid, 0, IPC_RMID, dummy) == -1) + errExit("semctl"); + + exit(EXIT_SUCCESS); +} diff --git a/Practice/04.10/shmat/svshm_string_write.c b/Practice/04.10/shmat/svshm_string_write.c new file mode 100644 index 0000000..121c614 --- /dev/null +++ b/Practice/04.10/shmat/svshm_string_write.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include + +#include "svshm_string.h" + +int main(int argc, char *argv[]) +{ + int semid, shmid; + char *addr; + size_t len; + struct sembuf sop; + + if (argc != 4) + { + fprintf(stderr, "Usage: %s shmid semid string\n", argv[0]); + exit(EXIT_FAILURE); + } + + len = strlen(argv[3]) + 1; /* +1 to include trailing '\0' */ + if (len > MEM_SIZE) + { + fprintf(stderr, "String is too big!\n"); + exit(EXIT_FAILURE); + } + + /* Get object IDs from command-line. */ + if((key = ftok("bin/sh", 'A')) = -1) errExit + shmid = atoi(argv[1]); + semid = atoi(argv[2]); + + /* Attach shared memory into our address space and copy string + (including trailing null byte) into memory. */ + + addr = shmat(shmid, NULL, 0); + if (addr == (void *)-1) + errExit("shmat"); + + memcpy(addr, argv[3], len); + + /* Decrement semaphore to 0. */ + + sop.sem_num = 0; + sop.sem_op = -1; + sop.sem_flg = 0; + + if (semop(semid, &sop, 1) == -1) + errExit("semop"); + + exit(EXIT_SUCCESS); +} diff --git a/Practice/29.09/code.c b/Practice/29.09/code.c new file mode 100644 index 0000000..488c0ad --- /dev/null +++ b/Practice/29.09/code.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define NUM 4 +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) +#define errExit1(msg) { perror(msg); _exit(EXIT_FAILURE); } + +void child_handler(int sig) { + pid_t pid; + while((pid = waitpid(-1, NULL, WNOHANG)) > 0); +} + +void int_handler(int sig){ + printf("Ctrl-C pressed, do nothing...\n"); +} + +int main(int argc, char *argv[]) { + + struct sigaction new_act, old_act; + sigemptyset (&new_act.sa_mask); + new_act.sa_flags = 0; + new_act.sa_flags = SA_RESTART; + new_act.sa_handler = child_handler; + + sigaction (SIGCHLD, &new_act, &old_act); + + struct sigaction nint_act, oint_act; + sigemptyset (&nint_act.sa_mask); + nint_act.sa_flags = 0; + nint_act.sa_flags = SA_RESTART; + nint_act.sa_handler = int_handler; + + sigaction (SIGINT, &nint_act, &oint_act); + + int pipefd[NUM][2]; + pid_t cpid[NUM]; + + int nfds, num_open_fds; + struct pollfd *pfds; + int ready; + + unsigned char i,tt; + char buf; + int rr; + + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + _exit(EXIT_FAILURE); + } + + srand(time(NULL)); + + num_open_fds = nfds = NUM; + pfds = calloc(nfds, sizeof(struct pollfd)); + if (pfds == NULL) errExit("malloc"); + + for (i=0;i 0) { + + do{ + dprintf(STDOUT_FILENO,"\ntry poll:\n"); + for (i = 0; i < NUM; i++) pfds[i].revents=0; + ready = poll(pfds, nfds, -1); + if(ready == -1) + switch (errno) { + case EINTR: dprintf(STDOUT_FILENO,"\nPoll interrupted, repeat.\n"); + continue; + default: errExit("poll"); + } + } while (ready <= 0); + + for (i = 0; i < NUM; i++) { + if (pfds[i].revents != 0) { + dprintf(STDOUT_FILENO," fd=%d; events: %7s%8s%9s%8s%8s ", pfds[i].fd, + (pfds[i].revents & POLLIN) ? "POLLIN " : "", + (pfds[i].revents & POLLHUP) ? "POLLHUP " : "", + (pfds[i].revents & POLLNVAL) ? "POLLNVAL " : "", + (pfds[i].revents & POLLPRI) ? "POLLPRI " : "", + (pfds[i].revents & POLLERR) ? "POLLERR " : ""); + if (pfds[i].revents & POLLIN) { + + do { + rr=read(pfds[i].fd, &buf, 1); + if (rr < 0) + switch (errno) { + case EINTR: dprintf(STDOUT_FILENO,"\nRead interrupted, repeat.\n"); + continue; + default: errExit("read"); + } + if(rr == 0 ) + dprintf(STDOUT_FILENO,"\n"); + else + dprintf(STDOUT_FILENO,"[%2X]",buf); + } while (rr > 0); + + } + else + if ((pfds[i].revents & (POLLHUP | ~POLLIN))) { + dprintf(STDOUT_FILENO,"Closing [%d], pipefd %d, pfds.fd %d\n",i,pipefd[i][0],pfds[i].fd); + if (close(pfds[i].fd) < 0 ) errExit("close pfds"); + pfds[i].fd = -1; + pfds[i].events=0; + num_open_fds--; + dprintf(STDOUT_FILENO,"Still opened fds %d\n",num_open_fds); + } + } + } + } +printf("Niggers"); +while (1) pause; + return EXIT_SUCCESS; +} diff --git a/Practice/matrix/Makefile b/Practice/matrix/Makefile new file mode 100644 index 0000000..be9314c --- /dev/null +++ b/Practice/matrix/Makefile @@ -0,0 +1,9 @@ +LIB = + +default: run + +build: + gcc func.h func.c main.c -o matrix_app ${LIB} + +run: build + ./matrix_app diff --git a/Practice/matrix/func.c b/Practice/matrix/func.c new file mode 100644 index 0000000..61c881b --- /dev/null +++ b/Practice/matrix/func.c @@ -0,0 +1,38 @@ + +#include "func.h" + +void init_matr(int c, short int mat[c][c]) +{ + for (int i = 0; i < c; i++) + { + for (int j = 0; j < c; j++) + { + mat[i][j] = rand() % N; + } + } +} +void out_matr(int c, short int mat[c][c]) +{ + for (int i = 0; i < c; i++) + { + for (int j = 0; j < c; j++) + { + printf("[%d] ", mat[i][j]); + } + printf("\n"); + } +} + +void trans(int c, short int mat[c][c]) +{ + for (int i = 0; i < c; i++) + { + for (int j = i + 1; j < c; j++) + { + short c; + c = mat[i][j]; + mat[i][j] = mat[j][i]; + mat[j][i] = c; + } + } +} diff --git a/Practice/matrix/func.h b/Practice/matrix/func.h new file mode 100644 index 0000000..033dc2c --- /dev/null +++ b/Practice/matrix/func.h @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define N 10 +#define n 100 + +void init_matr(int c, short int mat[c][c]); +void out_matr(int c, short int mat[c][c]); +void trans(int c, short int mat[c][c]); \ No newline at end of file diff --git a/Practice/matrix/main.c b/Practice/matrix/main.c new file mode 100644 index 0000000..e912db0 --- /dev/null +++ b/Practice/matrix/main.c @@ -0,0 +1,77 @@ + +#include "func.h" + +int main(int argc, char *argv[]) +{ + int pipefd[n][2], fd_ans; + caddr_t addr_ans; + pid_t cpid[n]; + short mat1[n][n], mat2[n][n]; + fd_ans = open(argv[2], O_RDWR | O_CREAT); + srand(time(NULL)); + init_matr(n, mat1); + init_matr(n, mat2); + out_matr(n, mat1); + trans(n, mat2); + printf("\n"); + out_matr(n, mat2); + printf("\n"); + for (int i = 0; i < n; i++) + { + if (pipe(pipefd[i]) == -1) + { + perror("pipe"); + exit(EXIT_FAILURE); + } + cpid[i] = fork(); + if (cpid[i] == -1) + { + perror("fork"); + exit(EXIT_FAILURE); + } + + if (cpid[i] == 0) + { + int result[n]; + close(pipefd[i][0]); + for (int j = 0; j < i; j++) + { + close(pipefd[j][0]); + close(pipefd[j][1]); + } + for (int j = 0; j < n; j++) + { + int sum = 0; + for (int k = 0; k < n; k++) + { + sum += mat1[i][k] * mat2[j][k]; + } + result[j] = sum; + } + write(pipefd[i][1], result, n * sizeof(int)); + close(pipefd[i][1]); + exit(EXIT_SUCCESS); + } + else + { + close(pipefd[i][1]); + } + } + + printf("Resulting mat\n"); + for (int i = 0; i < n; i++) + { + waitpid(cpid[i], NULL, WNOHANG); + int result[n]; + read(pipefd[i][0], result, n * sizeof(int)); + for (int j = 0; j < n; j++) + { + //printf("[%d] ", result[j]); + addr_ans = mmap((caddr_t)0, PROT_READ | PROT_WRITE, MAP_SHARED, fd_dst, 0); + + } + printf("\n"); + close(pipefd[i][0]); + } + exit(EXIT_SUCCESS); +} diff --git a/Practice/matrix/matrix_app b/Practice/matrix/matrix_app new file mode 100755 index 0000000000000000000000000000000000000000..c8b2ab82a33a7ec846c39ae9838b55a86bc6655f GIT binary patch literal 16712 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 literal 0 HcmV?d00001 diff --git a/Practice/sock20.10.23/c3.c b/Practice/sock20.10.23/c3.c new file mode 100644 index 0000000..06e81a1 --- /dev/null +++ b/Practice/sock20.10.23/c3.c @@ -0,0 +1,91 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SERVER_PATH "/tmp/unix_sock.server" +#define CLIENT_PATH "unix_sock.client" +#define DATA "Hello from client" +#define BUF 128 + +int main(int argc,char *argv[]){ + + int client_sock, rc, len; + struct sockaddr_un server_sockaddr; + struct sockaddr_un client_sockaddr; + char buf[BUF]; + size_t bs=BUF; + char cpath[22]; + + srand(time(NULL)); + sprintf(cpath,"%03d-%s",rand()%1000,CLIENT_PATH); + len = sizeof(client_sockaddr); + memset(&server_sockaddr, 0, sizeof(struct sockaddr_un)); + memset(&client_sockaddr, 0, sizeof(struct sockaddr_un)); + + client_sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (client_sock == -1) { + perror("socket"); + exit(1); + } + + + client_sockaddr.sun_family = AF_UNIX; + strcpy(client_sockaddr.sun_path, cpath); + + unlink(cpath); + rc = bind(client_sock, (struct sockaddr *) &client_sockaddr, len); + if (rc == -1){ + perror("bind"); + close(client_sock); + exit(1); + } + + server_sockaddr.sun_family = AF_UNIX; + strcpy(server_sockaddr.sun_path, SERVER_PATH); + rc = connect(client_sock, (struct sockaddr *) &server_sockaddr, len); + if(rc == -1){ + perror("connect"); + close(client_sock); + exit(1); + } + + if (argc > 1) + strcpy(buf, argv[1]); + else + strcpy(buf, DATA); + + printf("Sending data...\n"); + rc = send(client_sock, buf, strlen(buf), 0); + if (rc == -1) { + perror("send"); + close(client_sock); + exit(1); + } + else { + printf("Data sent!\n"); + } + + printf("Waiting to recieve data...\n"); + memset(buf, 0, sizeof(buf)); + rc = recv(client_sock, buf, bs,0); + if (rc == -1) { + perror("recv"); + close(client_sock); + exit(1); + } + else { + printf("DATA RECEIVED = %s\n", buf); + } + + close(client_sock); + unlink(cpath); + + return 0; +} diff --git a/Practice/sock20.10.23/c4.c b/Practice/sock20.10.23/c4.c new file mode 100644 index 0000000..010362d --- /dev/null +++ b/Practice/sock20.10.23/c4.c @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) +#define SerrExit(s,msg) do { close(s); perror(msg); _exit(EXIT_FAILURE); } while (0) + +#define SERVER_PATH "/tmp/unix_sock.server" +#define CLIENT_PATH "unix_sock.client" +#define DATA "Hello from client" +#define BUF 128 +#define FINS "exit_s" +#define FINC "exit_c" +//#define INFO + +int rcvBuffer(int sock_fd){ + int rcvBufferSize; + socklen_t sockOptSize = sizeof(rcvBufferSize); + getsockopt(sock_fd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize); +#ifdef INFO + printf("initial socket receive buf %d\n", rcvBufferSize); +#endif + return rcvBufferSize; +} + +int recvCount(const void *s, int size){ + register int count; + register int mark; + register char *p; + p=(char *)s; + count = 0; + mark = 0; + do { + if (*p && !(*(p+1))) count++; +#ifdef INFO + printf("[%c][%X]\n",*p,*p); +#endif + p++; + mark++; + } while (!((*p == '\0') && (*(p+1)=='\0')) && (mark < size)); + return count; +} + +int main(int argc,char *argv[]){ + + int client_sock, rc, len; + struct sockaddr_un server_sockaddr; + struct sockaddr_un client_sockaddr; + char obuf[BUF]; + char **ibuf; + size_t obs=BUF,ibs; + char cpath[22]; + + sprintf(cpath,"%d-%s",getpid(),CLIENT_PATH); + len = sizeof(client_sockaddr); + memset(&server_sockaddr, 0, sizeof(struct sockaddr_un)); + memset(&client_sockaddr, 0, sizeof(struct sockaddr_un)); + + client_sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (client_sock == -1) { + perror("socket"); + exit(1); + } + + + client_sockaddr.sun_family = AF_UNIX; + strcpy(client_sockaddr.sun_path, cpath); + + unlink(cpath); + rc = bind(client_sock, (struct sockaddr *) &client_sockaddr, len); + if (rc == -1) SerrExit(client_sock,"bind"); + + server_sockaddr.sun_family = AF_UNIX; + strcpy(server_sockaddr.sun_path, SERVER_PATH); + rc = connect(client_sock, (struct sockaddr *) &server_sockaddr, len); + if (rc == -1) SerrExit(client_sock,"connect"); + + ibs=rcvBuffer(client_sock); + if ((ibuf=(char **)malloc(ibs)) == NULL ) errExit("malloc"); + + do { + memset(obuf, 0, obs); + printf("> "); + scanf("%s",obuf); + + printf("Sending data...\n"); + rc = send(client_sock, obuf, strlen(obuf)+1, 0); + if (rc == -1) { + perror("send"); + close(client_sock); + exit(1); + } else { + printf("Data sent!\n"); + } + + printf("Waiting to recieve data...\n"); + memset(ibuf, 0, ibs); + rc = recv(client_sock, ibuf, ibs,0); + if (rc == -1) { + perror("recv"); + close(client_sock); + exit(1); + } else { + int c = recvCount(ibuf,ibs); +#ifdef INFO + char *p = (char *)ibuf; + printf("count: %d resieved\n",c); + for (int i = 0; i < 32; i++){ + printf("[%c][%X]",*p,*p); + p++; + } + printf("\n"); +#endif +#ifndef INFO + char p[obs]; + char *tp = (char *)ibuf; +// if ((ibuf=(char **)malloc(ibs)) == NULL ) errExit("malloc"); + for (int i = 0; i < c; i++){ + memset(p,0,obs); + while (*tp) {strncat(p,tp,1);tp++;} + tp++; +// printf("DATA RECEIVED [%ld] = %s\n", strlen(ibuf[i]),ibuf[i]); + printf("DATA RECEIVED [%ld] = %s\n", strlen(p),p); +// printf("DATA RECEIVED [%ld] = %s\n", strlen(p[i]),p[i]); + } +#endif + } + + } while (strcmp(obuf,FINC) && strcmp(obuf,FINS)); + + close(client_sock); + unlink(cpath); + + return 0; +} diff --git a/Practice/sock20.10.23/s3.c b/Practice/sock20.10.23/s3.c new file mode 100644 index 0000000..e82bbd3 --- /dev/null +++ b/Practice/sock20.10.23/s3.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) + +#define SOCK_PATH "/tmp/unix_sock.server" +#define DATA "Hello from server" +#define BUF 128 +#define FIN "exit" + +int session(int client_sock, struct sockaddr_un server_sockaddr, struct sockaddr_un client_sockaddr){ + int rc; + char inbuf[BUF]; + char outbuf[BUF]; + int bytes_rec = 0; + size_t bs = BUF; + socklen_t len; + len = sizeof(client_sockaddr); + rc = getpeername(client_sock, (struct sockaddr *) &client_sockaddr, &len); + if (rc == -1){ + close(client_sock); + errExit("getpeer"); + } else { + printf("Client socket filepath: %s\n", client_sockaddr.sun_path); + } + + printf("waiting to read...\n"); + memset(inbuf, 0, bs); + bytes_rec = recv(client_sock, inbuf, bs, 0); + if (bytes_rec == -1){ + close(client_sock); + errExit("recv"); + } else { + printf("DATA RECEIVED = %s\n", inbuf); + } + + memset(outbuf, 0, bs); + strcpy(outbuf, DATA); + printf("Sending data...\n"); + rc = send(client_sock, outbuf, strlen(outbuf), 0); + if (rc == -1) { + close(client_sock); + errExit("send"); + } else { + printf("Data sent!\n"); + } + close(client_sock); + return strcmp(inbuf,FIN); +} + + +int main(void){ + + int server_sock, client_sock, rc; + socklen_t len; + struct sockaddr_un server_sockaddr; + struct sockaddr_un client_sockaddr; + int backlog = 10; + + len = sizeof(server_sockaddr); + memset(&server_sockaddr, 0, sizeof(struct sockaddr_un)); + memset(&client_sockaddr, 0, sizeof(struct sockaddr_un)); + + server_sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (server_sock == -1) errExit("socket"); + + server_sockaddr.sun_family = AF_UNIX; + strcpy(server_sockaddr.sun_path, SOCK_PATH); + + unlink(SOCK_PATH); + rc = bind(server_sock, (struct sockaddr *) &server_sockaddr, len); + if (rc == -1){ + close(server_sock); + errExit("bind"); + } + + rc = listen(server_sock, backlog); + if (rc == -1){ + close(server_sock); + errExit("listen"); + } + + printf("socket listening...\n"); + + do { + client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len); + if (client_sock == -1){ + close(server_sock); + close(client_sock); + errExit("accept"); + } + } while (session(client_sock,server_sockaddr,client_sockaddr)); + + + close(server_sock); + unlink(SOCK_PATH); + + return 0; +} diff --git a/Practice/sock20.10.23/s4.c b/Practice/sock20.10.23/s4.c new file mode 100644 index 0000000..48b2e3f --- /dev/null +++ b/Practice/sock20.10.23/s4.c @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) + +#define SOCK_PATH "/tmp/unix_sock.server" +#define DATA "Hello from server" +#define BUF 128 +#define FINS "exit_s" +#define FINC "exit_c" + +void child_handler(int sig) { + pid_t pid; + while((pid = waitpid(-1, NULL, WNOHANG)) > 0); +} + +void session(int client_sock, struct sockaddr_un server_sockaddr, struct sockaddr_un client_sockaddr){ + int rc; + char inbuf[BUF]; + char outbuf[BUF]; + int bytes_rec = 0; + size_t bs = BUF; + socklen_t len; + pid_t ppid, pid; + + ppid=getppid(); + pid=getpid(); + + len = sizeof(client_sockaddr); + rc = getpeername(client_sock, (struct sockaddr *) &client_sockaddr, &len); + if (rc == -1){ + close(client_sock); + errExit("getpeer"); + } else { + printf("[%d] Client socket filepath: %s\n", pid, client_sockaddr.sun_path); + } + do { + printf("waiting for %s...\n",client_sockaddr.sun_path); + memset(inbuf, 0, bs); + bytes_rec = recv(client_sock, inbuf, bs, 0); + if (bytes_rec == -1){ + close(client_sock); + errExit("recv"); + } else { + printf("[%s]: %s\n", client_sockaddr.sun_path, inbuf); + } + + memset(outbuf, 0, bs); + strcpy(outbuf, DATA); + printf("Sending data...\n"); + rc = send(client_sock, outbuf, strlen(outbuf)+1, 0); + if (rc == -1) { + close(client_sock); + errExit("send"); + } else { + printf("Data sent!\n"); + } + if (strcmp(inbuf,FINS) == 0 ) {kill(ppid,SIGTERM);break;} + } while (strcmp(inbuf,FINC)); + memset(outbuf, 0, bs); + sprintf(outbuf,"Exit %d\n",pid); + rc = send(client_sock, outbuf, strlen(outbuf)+1, 0); + if (rc == -1) { + close(client_sock); + errExit("send"); + } + close(client_sock); + exit(0); +} + +int main(void){ + + int server_sock, client_sock, rc; + socklen_t len; + struct sockaddr_un server_sockaddr; + struct sockaddr_un client_sockaddr; + int backlog = 10; + pid_t pid; + + struct sigaction new_act, old_act; + sigemptyset (&new_act.sa_mask); + new_act.sa_flags = SA_RESTART; + new_act.sa_handler = child_handler; + sigaction (SIGCHLD, &new_act, &old_act); + + len = sizeof(server_sockaddr); + memset(&server_sockaddr, 0, sizeof(struct sockaddr_un)); + memset(&client_sockaddr, 0, sizeof(struct sockaddr_un)); + + server_sock = socket(AF_UNIX, SOCK_STREAM, 0); + if (server_sock == -1) errExit("socket"); + + server_sockaddr.sun_family = AF_UNIX; + strcpy(server_sockaddr.sun_path, SOCK_PATH); + + unlink(SOCK_PATH); + rc = bind(server_sock, (struct sockaddr *) &server_sockaddr, len); + if (rc == -1){ + close(server_sock); + errExit("bind"); + } + + rc = listen(server_sock, backlog); + if (rc == -1){ + close(server_sock); + errExit("listen"); + } + + printf("socket listening...\n"); + + do { + client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len); + if (client_sock == -1){ + close(server_sock); + close(client_sock); + errExit("accept"); + } + if ((pid = fork()) == -1 ) { + close(server_sock); + close(client_sock); + errExit("fork"); + } + if (pid == 0) session(client_sock,server_sockaddr,client_sockaddr); + close(client_sock); + } while (1); + + + close(server_sock); + unlink(SOCK_PATH); + + return 0; +} diff --git a/Practice/trash/app b/Practice/trash/app new file mode 100755 index 0000000000000000000000000000000000000000..e287e7b9daaecc31ff00def9ad34c2c7fd285a6c GIT binary patch literal 16248 zcmeHOYit}>6~61ljoUozv$F?!)Yk z6FZ8)RY=v9Whp_>hDSv}NR0rYs0EZ(Je)R3Q-mUiA1H$UuqrC8MISB{2+(Hv&Yg3{ z<6(_ZCHR5nSi9dnkMG_)XYS12@!b2xj_%H~P)La^Q4cE8&Q&>j6p^oz}$Z1tul8L^?hAqi>Z8DJ_8Lb^{YOHN+h~zSnt-1@;FKUCv)ULe; zRoS?jBAf83yapdiEBPN<_HNsWQ?U=QQt7do${>ZfBXWe+W4 z{{ie_eEiZ5L#cZ1gng4gm~?A2VXMrrl~$&SbKY;}>{!+|Q?UeD`bT5tKq4JWCXQMv zWu^Lu$JCK*!iJKH4Xb3%vK~fK|;t*kYe$k|r5cTZa~leT(eeMt-L52i9{?vd$)mJFnE62jP_zYy*N4wkdF8;2>^ z!?UNJK&s1CFWbJN^`**WePn&&RvLw$WBo_kU#1R2Cz1P@+&@mPcI?;rJ|*@Zwnw9m zU+kh!?R4yP-sv2RT=Cdx?2Al$?9O%Ic&>Zww@EN?#$%`J$Cap4qMr%Aukc-26Ge&iA@a}86d`xNKsrs~ zW~a6OJn1xbo1N17Go;g0YxbPhzehSvv1ZR`{X3-7)N1ym*1t|VP4Q;OwSGVJfs@d+ z)W6Y{zxG)p|Eh8P_j5hH9raW7FB_B1SK%zKeJi5WI|Gr*nlI^C>MwjTRA5Y&e~Mto z4SOvP_bLMEaBnTnRMw1B@QaLyuh;S0?RcGX{!gC)yWT7)`OsDULtB z$CUhKRMYYtQCjj-&rzU`{smbIzoW2x$DFR6LT~s&X=pg1=bX@j6Z(QNv4>a%^aDp& zcm`f4?h3`xxLq((skK0Y3|4V6hB@_-$io!;%N+ z-5fobSI-rTqrlU^Gr+Sz19W>s>n|7><@vn zi2_(k$18Og{1kustzvPUVpmmluBzT$x%^1QxZ1h?fqS>zrK=%69<$XP;=J!ws$u&y zKG)D*4Ly3ctg3pftZk+D9TBX71Q`f25M&_8K#+kT13?CY3JaesQUDo@_`fTz4`DQUgA!m4Tox5g^ z3-Vlch5fg2eU}+!4IDk!k*syV{brgf@cKS_(M)pI0r$C7*5rMV?Q`6)*y~uAeot|n ztj&}5|50>~2W}mTx1sv@X83sU5>@MxXFP^#{WAOi#=7*IoB5xEtRMF`+{ojglkpRb z1B{0mA7gxiQR<0Cozkwhw)?~Pv|D|NSUOz4HL^8QS6kn(nTrzruSj`Ys@^X8J#-#u zCF?OxT$lsy0G5j12z!~TR5QN*5s&OuydD**7Fy>_cDYX2th!JLsrAZ;Iu<#vv^qP4 z(J15I@hWu;1*%7`JF!2mz@B`h_}W2t(6s^dSP{O9|U zrrqwYx0hP3>-cK-dJ_AaD3n@9y&MS%OOOX2(e`z!De5tz_)*wP)w2WkDz(ndv#_ER zUsk2$ekAtJMe2EY5qpB`_xI;8>|v?YgC}5LUA9iicox@}VK3GH?@~Peq%!)y8OgJ- zS7H40M78REWpq82?!FrRPc3-QbG(c27H?Zm6Y>cN6T=XEzvyW{NMv3TxkWrw;UI?fOUtYuICb3Db@ZDj0J1$iP6P zU(K&~H|>T~7#=F9=Oq{Wkhznw|Sw_H>vXd)rN{vv2?8-j+RGZ7^e7 zhS_1T*J$6b%w664T3fo!eVv^LI(p6Cme%eLF#KBwqV67mf4{7&w{3>J9xhJytbWDW7o9s%@Y;f4V-p39g+v2+}p37p*vE*Coz%&vXl#S>|BBxl9Z zavEP|UoOYB={*p%HNquP2Wi8^0)uH{(}JXqb~BXRqM$cPxIAo)Sh%^u_2?YXc~UBp z8%x=-KA@d-a7aptH1hPgh zZb(JqV`((upq+I*hplWbkx4I5O!%@^GDZY04JU0C(cO%o7#Yk!wXIQn({MykMxVxr zHN*pOD2_@*bEwWpbQn@b3$aw9AI)cMsu`W5;Sj-DQ4w4VDGYJ%_4j_uG_S)g0KZ+1 zRP*nwpv>#otz)H3_z`?)E+zaX<_m`5^NP%~#MX#{mw$-)g7jX%D{_Ao8~sju`7%!s z3`-!RpZ_rIf5F^L`Y-cUL1|y+tN#ASz^A#Y@MS(L*hI;NP#>u%e3@4!V5378zPq`E z=Z!KSMu--!PE_@IlxXfLe3@?w$~;~AFL8oj0H5ZvqRV_%u!mdn_g^|Ni2~(R_%fds zoZ>)f-+%m1GQXAMWPUDq*2AZq`T5_5jdCLOyT3pDJ0$adu15D&%7ov<$IA~hPjH-q zJR(1Df=|Qe<)2}Pp!8R&5MA(`k1zXe1uG=6T!FMJ_5H-hm-&()&7ZyEAOFrgasK?N zFh?`;Fm$W%^Dn|f$1mNiV4fhoOZ1AL|7$qC{HCxIEqK;TMp^PE=2uWyg%960+ z8qD{{Q(InH&Fyoz>k@vAYjFy~_o9qFZ|D$LIL95k6Hc1XN`K`3OV@|=-OE4J;Am~W X%B5Y2rD=I7{x|4{4YJ-x@TuybQ?#mI literal 0 HcmV?d00001 diff --git a/Practice/trash/app_poll b/Practice/trash/app_poll new file mode 100755 index 0000000000000000000000000000000000000000..8384509aaaec3069e94548556999b7e8787251e8 GIT binary patch literal 16992 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 literal 0 HcmV?d00001 diff --git a/Practice/trash/child.c b/Practice/trash/child.c new file mode 100644 index 0000000..c14b1fd --- /dev/null +++ b/Practice/trash/child.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define DATA 20 +#define NUM 4 + +struct Data { + char s[DATA + 1]; + pid_t cpid; + unsigned char i, t; +}; + +int main(int argc, char *argv[]){ + int pipefd[4][2]; + pid_t cpid[4]; + unsigned char i, tt; + int rr, wt; + +if (argc != 2){ + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(EXIT_FAILURE); +} + +srand(time(NULL)); + +for(i = 0; i < NUM; i++){ + if (pipe(pipefd[i]) == -1){ + perror("Pipe"); + exit(EXIT_FAILURE); + } + tt = (unsigned char)rand()%8; + dprintf(STDOUT_FILENO, "Time[%X]\n", tt); + + cpid[i] = fork(); + if (cpid[i] == -1){ + perror("Fork"); + exit(EXIT_FAILURE); + } + + if (cpid[i] == 0){ + struct Data data; + close(pipefd[i][0]); + for(int j = 0; j < i; j++){ + close(pipefd[j][0]); + close(pipefd[j][1]); + } + data.cpid = getpid(); + data.i = i; + data.t = tt; + strncpy(data.s, argv[1], DATA); + write(pipefd[i][1], &data, sizeof(struct Data)); + close(pipefd[i][1]); + sleep(tt); + _exit(EXIT_FAILURE); + } else { + dprintf(STDOUT_FILENO, "Start [%d]\n", cpid[i]); + close(pipefd[i][1]); + } +} + +printf("Waiting...\n"); + +while((wt = waitpid(-1, NULL, WNOHANG)) > -1){ + if (wt > 0) for(i = 0; i < NUM; i++){ + if (cpid[i] == wt){ + struct Data data; + while((rr = read(pipefd[i][0], &data, sizeof(struct Data))) > 0){ + dprintf(STDOUT_FILENO, "[%d] num = %d, time = %d [%s]\n", data.cpid, data.i, data.t, data.s); + } + if (rr == 0) close(pipefd[i][0]); + } + } + usleep(3000000); +} +if (errno == ECHILD) + perror("Finish:"); +else + perror("Wait error:"); + exit(EXIT_SUCCESS); +} \ No newline at end of file diff --git a/Practice/trash/done b/Practice/trash/done new file mode 100644 index 0000000..7e045a0 --- /dev/null +++ b/Practice/trash/done @@ -0,0 +1,2 @@ +be be be be +aaaaaaaaaaa \ No newline at end of file diff --git a/Practice/trash/lect.c b/Practice/trash/lect.c new file mode 100644 index 0000000..81ed6cd --- /dev/null +++ b/Practice/trash/lect.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +#include +#include +#include + + +int main(int argc, char *argv[]){ + int fd_src, fd_dst; + caddr_t addr_src, addr_dst; + struct stat filestat; + fd_src = open(argv[1], O_RDONLY); + fd_dst = open(argv[2], O_RDWR | O_CREAT); + fstat(fd_src, &filestat); + lseek(fd_dst, filestat.st_size - 1, SEEK_SET); + write(fd_dst, "", 1); + addr_src = mmap((caddr_t)0, filestat.st_size, PROT_READ, MAP_SHARED, fd_src, 0); + addr_dst = mmap((caddr_t)0, filestat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_dst, 0); + memcpy(addr_dst, addr_src, filestat.st_size); + exit(0); +} \ No newline at end of file diff --git a/Practice/trash/pin.c b/Practice/trash/pin.c new file mode 100644 index 0000000..f99b0de --- /dev/null +++ b/Practice/trash/pin.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define NUM 4 + +int main(int argc, char *argv[]){ + int pipefd[4][2]; + pid_t cpid[4]; + unsigned char i, tt; + char buf; + int rr, wt; + +if (argc != 2){ + fprintf(stderr, "Usage: %s \n", argv[0]); + exit(EXIT_FAILURE); +} + +srand(time(NULL)); + +for(i = 0; i < NUM; i++){ + if (pipe(pipefd[i]) == -1){ + perror("Pipe"); + exit(EXIT_FAILURE); + } + tt = (unsigned char)rand()%8; + dprintf(STDOUT_FILENO, "Time[%X]\n", tt); + + cpid[i] = fork(); + if (cpid[i] == -1){ + perror("Fork"); + exit(EXIT_FAILURE); + } + + if (cpid[i] == 0){ + close(pipefd[i][0]); + write(pipefd[i][1], argv[1], strlen(argv[1])); + write(pipefd[i][1], &i, 1); + write(pipefd[i][1], &tt, 1); + close(pipefd[i][1]); + sleep(tt); + _exit(EXIT_FAILURE); + } else { + close(pipefd[i][1]); + } +} + +printf("Waiting...\n"); + +while((wt = waitpid(-1, NULL, WNOHANG)) > -1){ + if (wt > 0) for(i = 0; i < NUM; i++){ + if (cpid[i] == wt){ + while((rr = read(pipefd[i][0], &buf, 1)) > 0){ + write(STDOUT_FILENO, &buf, 1); + dprintf(STDOUT_FILENO, "[%X]", buf); + } + if (rr == 0){ + write(STDOUT_FILENO, "\n", 1); + close(pipefd[i][0]); + } + } + } +} +if (errno == ECHILD) + perror("Finish:"); +else + perror("Wait error:"); + exit(EXIT_SUCCESS); +} \ No newline at end of file diff --git a/Practice/trash/poll.c b/Practice/trash/poll.c new file mode 100644 index 0000000..9c8ce94 --- /dev/null +++ b/Practice/trash/poll.c @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define NUM 4 +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) +#define errExit1(msg) { perror(msg); _exit(EXIT_FAILURE); } + +void child_handler(int sig) { + pid_t pid; + while((pid = waitpid(-1, NULL, WNOHANG)) > 0); +} + +int main(int argc, char *argv[]) { + + struct sigaction new_act, old_act; + sigemptyset (&new_act.sa_mask); + new_act.sa_flags = 0; + new_act.sa_handler = child_handler; + + sigaction (SIGCHLD, &new_act, &old_act); + + int pipefd[NUM][2]; + pid_t cpid[NUM]; + + int nfds, num_open_fds; + struct pollfd *pfds; + int ready; + + unsigned char i,tt; + char buf; + int rr; + + if (argc != 2) { + fprintf(stderr, "Usage: %s \n", argv[0]); + _exit(EXIT_FAILURE); + } + + srand(time(NULL)); + + num_open_fds = nfds = NUM; + pfds = calloc(nfds, sizeof(struct pollfd)); + if (pfds == NULL) errExit("malloc"); + + for (i=0;i 0) { + + do{ + dprintf(STDOUT_FILENO,"\ntry poll:\n"); + for (i = 0; i < NUM; i++) pfds[i].revents=0; + ready = poll(pfds, nfds, -1); + if(ready == -1) + switch (errno) { + case EINTR: dprintf(STDOUT_FILENO,"\nPoll interrupted, repeat.\n"); + continue; + default: errExit("poll"); + } + } while (ready <= 0); + + for (i = 0; i < NUM; i++) { + if (pfds[i].revents != 0) { + dprintf(STDOUT_FILENO," fd=%d; events: %7s%8s%9s%8s%8s ", pfds[i].fd, + (pfds[i].revents & POLLIN) ? "POLLIN " : "", + (pfds[i].revents & POLLHUP) ? "POLLHUP " : "", + (pfds[i].revents & POLLNVAL) ? "POLLNVAL " : "", + (pfds[i].revents & POLLPRI) ? "POLLPRI " : "", + (pfds[i].revents & POLLERR) ? "POLLERR " : ""); + if (pfds[i].revents & POLLIN) { + + do { + rr=read(pfds[i].fd, &buf, 1); + if (rr < 0) + switch (errno) { + case EINTR: dprintf(STDOUT_FILENO,"\nRead interrupted, repeat.\n"); + continue; + default: errExit("read"); + } + if(rr == 0 ) + dprintf(STDOUT_FILENO,"\n"); + else + dprintf(STDOUT_FILENO,"[%2X]",buf); + } while (rr > 0); + + } + else + if ((pfds[i].revents & (POLLHUP | ~POLLIN))) { + dprintf(STDOUT_FILENO,"Closing [%d], pipefd %d, pfds.fd %d\n",i,pipefd[i][0],pfds[i].fd); + if (close(pfds[i].fd) < 0 ) errExit("close pfds"); + pfds[i].fd = -1; + pfds[i].events=0; + num_open_fds--; + dprintf(STDOUT_FILENO,"Still opened fds %d\n",num_open_fds); + } + } + } + } + + return EXIT_SUCCESS; +} diff --git a/Practice/trash/poll2.c b/Practice/trash/poll2.c new file mode 100644 index 0000000..660a080 --- /dev/null +++ b/Practice/trash/poll2.c @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NUM 4 +#define errExit(msg) do { perror(msg); _exit(EXIT_FAILURE); } while (0) +#define errExit1(msg) { perror(msg); _exit(EXIT_FAILURE); } + +struct Child { +unsigned char lifetime; +char* message; +}; + +void child_handler(int sig) { +pid_t pid; +while((pid = waitpid(-1, NULL, WNOHANG)) > 0); +} + +int main(int argc, char *argv[]) { + +struct sigaction new_act, old_act; +sigemptyset (&new_act.sa_mask); +new_act.sa_flags = 0; +new_act.sa_handler = child_handler; + +sigaction (SIGCHLD, &new_act, &old_act); + +int pipefd[NUM][2]; +pid_t cpid[NUM]; + +int nfds, num_open_fds; +struct pollfd *pfds; +int ready; + +unsigned char i,tt; +char buf; +int rr; + +struct Child children[NUM]; + +if (argc != 2) { +fprintf(stderr, "Usage: %s \n", argv[0]); +_exit(EXIT_FAILURE); +} + +srand(time(NULL)); + +num_open_fds = nfds = NUM; +pfds = calloc(nfds, sizeof(struct pollfd)); +if (pfds == NULL) errExit("malloc"); + +for (i=0;i 0) { + +do{ +dprintf(STDOUT_FILENO,"\ntry poll:\n"); +for (i = 0; i < NUM; i++) pfds[i].revents=0; +ready = poll(pfds, nfds, -1); +if(ready == -1) +switch (errno) { +case EINTR: dprintf(STDOUT_FILENO,"\nPoll interrupted, repeat.\n"); +continue; +default: errExit("poll"); +} +} while (ready <= 0); + +for (i = 0; i < NUM; i++) { +if (pfds[i].revents != 0) { +dprintf(STDOUT_FILENO," fd=%d; events: %7s%8s%9s%8s%8s ", pfds[i].fd, +(pfds[i].revents & POLLIN) ? "POLLIN " : "", +(pfds[i].revents & POLLHUP) ? "POLLHUP " : "", +(pfds[i].revents & POLLNVAL) ? "POLLNVAL " : "", +(pfds[i].revents & POLLPRI) ? "POLLPRI " : "", +(pfds[i].revents & POLLERR) ? "POLLERR " : ""); +if (pfds[i].revents & POLLIN) { + +do { +rr=read(pfds[i].fd, &buf, 1); +if (rr < 0) +switch (errno) { +case EINTR: dprintf(STDOUT_FILENO,"\nRead interrupted, repeat.\n"); +continue; +default: errExit("read"); +} +if(rr == 0 ) +dprintf(STDOUT_FILENO,"\n"); +else +dprintf(STDOUT_FILENO,"[%2X]",buf); +} while (rr > 0); + +} +else +if ((pfds[i].revents & (POLLHUP | ~POLLIN))) { +dprintf(STDOUT_FILENO,"Closing [%d], pipefd %d, pfds.fd %d\n",i,pipefd[i][0],pfds[i].fd); +if (close(pfds[i].fd) < 0 ) errExit("close pfds"); +pfds[i].fd = -1; +pfds[i].events=0; +num_open_fds--; +dprintf(STDOUT_FILENO,"Still opened fds %d\n",num_open_fds); +} +} +} +} + +return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/Practice/trash/prog1 b/Practice/trash/prog1 new file mode 100644 index 0000000..42d46a3 --- /dev/null +++ b/Practice/trash/prog1 @@ -0,0 +1,37 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int mtx(int *m, int s){ + srand(time(NULL)); + for(int i = 0; i < s; i++) + *m++ = rand()%0xffff; + return 0; +} + +int main(int argc, char *argv[]){ + int fd; + int n,s; + size_t ms; + int *m; + int *fa; + + if (argc < 3){ + printf("Usage: a.out size filename\n"); + } + s = n*n; + ms = s*sizeof(int); + + if((fd = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1){ + perror("open: "); + exit(errno); + + } +} \ No newline at end of file diff --git a/Practice/trash/text b/Practice/trash/text new file mode 100644 index 0000000..7e045a0 --- /dev/null +++ b/Practice/trash/text @@ -0,0 +1,2 @@ +be be be be +aaaaaaaaaaa \ No newline at end of file