[<<Previous Entry]
[^^Up^^]
[Next Entry>>]
[Menu]
[About The Guide]
Тексты программ
create.c
1 #include <sys/types.h>
2 #include <time.h>
3 #include <string.h>
4 #include <unistd.h>
5 #include <stdlib.h>
6 #include <fcntl.h>
7 #include <stdio.h>
8 #include <sys/uio.h>
9 #include "employee.h"
10 #include "empheader.h"
11
12 main(int argc, char *argv[])
13 {
14 int fd;
15 struct employee record;
16 struct recheader header;
17 struct iovec iov[2];
18
19 if (argc < 2) {
20 fprintf(stderr, "Usage: %s file\n", argv[0]);
21 exit(1);
22 }
23 if ((fd = open(argv[1], O_WRONLY | O_CREAT |
24 O_SYNC | O_EXCL, 0640)) == -1) {
25 perror(argv[1]);
26 exit(2);
27 }
28
29 iov[0].iov_base = (caddr_t)&header;
30 iov[1].iov_base = (caddr_t)&record;
31 iov[0].iov_len = sizeof(header);
32 iov[1].iov_len = sizeof(record);
33
34 init_header(&header);
35
36 for (;;) {
37 printf("Enter employee name <SPACE> salary: ");
38 scanf("%s", record.name);
39 if (record.name[0] == '.')
40 break;
41 scanf("%d", &record.salary);
42 writev(fd, iov, 2);
43 }
44 close(fd);
45 exit(0);
46 }
47
48 static void init_header(struct recheader *head)
49 {
50 long tloc;
51
52 tloc = time(0);
53 strncpy(head->date,ctime(&tloc),24);
54 head->uid = getuid();
55 }
inquire.c
1 #include <sys/types.h>
2 #include <time.h>
3 #include <string.h>
4 #include <stdlib.h>
5 #include <fcntl.h>
6 #include <stdio.h>
7 #include <unistd.h>
8 #include <sys/uio.h>
9 #include "employee.h"
10 #include "empheader.h"
11
12 main(int argc, char *argv[])
13 {
14 int fd, recnum;
15 struct employee record;
16 struct recheader header;
17 struct iovec iov[2];
18
19 if ((fd = open(argv[1], O_RDONLY)) == -1) {
20 perror(argv[1]);
21 exit(2);
22 }
23
24 iov[0].iov_base = (caddr_t)&header;
25 iov[1].iov_base = (caddr_t)&record;
26 iov[0].iov_len = sizeof(header);
27 iov[1].iov_len = sizeof(record);
28
29 for (;;) {
30 printf("\nEnter record number: ");
31 scanf("%d", &recnum);
32 if (recnum == 0)
33 break;
34 lseek(fd, (recnum-1)*(sizeof(record)+sizeof(header)),
35 SEEK_SET);
36 if (readv(fd, iov, 2) > 0)
37 printf("Employee: %s\tSalary: %d\n",
38 record.name, record.salary);
39 else
40 printf("Record %d not found\n", recnum);
41 }
42 close(fd);
43 exit(0);
44 }
update1.c
1 #include <sys/mman.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <fcntl.h>
5 #include <sys/types.h>
6 #include <unistd.h>
7 #include <errno.h>
8 #include "employee.h"
9
10 main(int argc, char *argv[])
11 {
12 off_t size;
13 struct employee *p;
14 int fd, recnum;
15
16 if ((fd = open(argv[1], O_RDWR)) == -1) {
17 perror(argv[1]);
18 exit(1);
19 }
20
21 size = lseek(fd, 0, SEEK_END);
22 p = (struct employee *)mmap(0, size,
23 PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
24
25 for(;;) {
26 printf("\nEnter record number: ");
27 scanf("%d", &recnum);
28 recnum--;
29 if (recnum < 0)
30 break;
31 if (recnum * sizeof(struct employee) >= size) {
32 printf("record %d not found\n", recnum+1);
33 continue;
34 }
35 printf("Employee: %s, salary: %d\n",
36 p[recnum].name, p[recnum].salary);
37
38 printf("Enter new salary: ");
39 scanf("%d", &p[recnum].salary);
40 msync(p, size, MS_SYNC);
41 }
42 munmap(p, size);
43 close(fd);
44 }