| #include "apue.h" | |
| #include <errno.h> | |
| void make_temp(char *template); | |
| int | |
| main() | |
| { | |
| char good_template[] = "/tmp/dirXXXXXX"; /* right way */ | |
| char *bad_template = "/tmp/dirXXXXXX"; /* wrong way*/ | |
| printf("trying to create first temp file...\n"); | |
| make_temp(good_template); | |
| printf("trying to create second temp file...\n"); | |
| make_temp(bad_template); | |
| exit(0); | |
| } | |
| void | |
| make_temp(char *template) | |
| { | |
| int fd; | |
| struct stat sbuf; | |
| if ((fd = mkstemp(template)) < 0) | |
| err_sys("can't create temp file"); | |
| printf("temp name = %s\n", template); | |
| close(fd); | |
| if (stat(template, &sbuf) < 0) { | |
| if (errno == ENOENT) | |
| printf("file doesn't exist\n"); | |
| else | |
| err_sys("stat failed"); | |
| } else { | |
| printf("file exists\n"); | |
| unlink(template); | |
| } | |
| } | |
| /* | |
| If we execute this program, we get | |
| $ ./a.out | |
| trying to create first temp file... | |
| temp name = /tmp/dirUmBT7h | |
| file exists | |
| trying to create second temp file... | |
| Segmentation fault | |
| The difference in behavior comes from the way the two template strings are | |
| declared. For the first template, the name is allocated on the stack, because we use an | |
| array variable. For the second name, however, we use a pointer. In this case, only the | |
| memory for the pointer itself resides on the stack; the compiler arranges for the string to | |
| be stored in the read-only segment of the executable. When the mkstemp function tries | |
| to modify the string, a segmentation fault occurs. | |
| */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment