- 论坛徽章:
- 11
|
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/wait.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int nowait = 0;
void* thFork(void*);
void pFiles();
/* gcc -g -O2 -Wall fork.c -o foo -lpthread -lrt */
int main()
{
int ret = 0;
pthread_t tid;
struct timespec timeout;
FILE* fp;
pFiles("main");
fp = fopen("my.txt", "w");
assert(fp);
assert(pthread_create(&tid, NULL, thFork, NULL) == 0);
timeout.tv_sec = time(NULL) + 60;
timeout.tv_nsec = 0;
pthread_mutex_lock(&mutex);
while (!nowait && ret != ETIMEDOUT) {
ret = pthread_cond_timedwait(&cond, &mutex, &timeout);
}
pthread_mutex_unlock(&mutex);
fprintf(stdout, "Main is done\n");
fclose(fp);
return 0;
}
void pFiles(char* prefix)
{
FILE* fp;
char cmd[64];
char buf[1024];
fprintf(stdout, "%s:\n", prefix);
sprintf(cmd, "pfiles %ld", getpid());
fp = popen(cmd, "r");
assert(fp);
while (fgets(buf, sizeof(buf), fp) != NULL) {
fputs(buf, stdout);
}
pclose(fp);
}
void* thFork(void* args)
{
struct timespec rqtm;
int status;
pid_t pid;
rqtm.tv_sec = 3;
rqtm.tv_nsec = 0;
pthread_detach(pthread_self());
pFiles("thFork");
pid = fork();
if (pid == 0) {
nanosleep(&rqtm, NULL);
pFiles("child");
exit(0);
} else if (pid < 0) {
perror("fork");
assert(0);
}
wait(&status);
pthread_mutex_lock(&mutex);
nowait = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
fprintf(stdout, "thFork is done\n");
return NULL;
}
|
- -bash-3.00$ uname -a
- SunOS v440test-2 5.10 Generic_118833-36 sun4u sparc SUNW,Sun-Fire-V440
- -bash-3.00$ gcc -g -O2 -Wall fork.c -o foo -lpthread -lrt
- -bash-3.00$ ./foo
- main1:
- 1042: ./foo
- Current rlimit: 256 file descriptors
- 0: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 1: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 2: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 3: S_IFIFO mode:0000 dev:344,0 ino:30884122 uid:1010 gid:101 size:0
- O_RDWR
- main2:
- 1042: ./foo
- Current rlimit: 256 file descriptors
- 0: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 1: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 2: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 3: S_IFREG mode:0644 dev:32,39 ino:72743 uid:1010 gid:101 size:0
- O_WRONLY|O_CREAT|O_TRUNC
- /export/home1/lbs/my.txt
- 4: S_IFIFO mode:0000 dev:344,0 ino:30884123 uid:1010 gid:101 size:0
- O_RDWR
- thFork:
- 1042: ./foo
- Current rlimit: 256 file descriptors
- 0: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 1: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 2: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 3: S_IFREG mode:0644 dev:32,39 ino:72743 uid:1010 gid:101 size:0
- O_WRONLY|O_CREAT|O_TRUNC
- /export/home1/lbs/my.txt
- 4: S_IFIFO mode:0000 dev:344,0 ino:30884124 uid:1010 gid:101 size:0
- O_RDWR
- child:
- 1049: ./foo
- Current rlimit: 256 file descriptors
- 0: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 1: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 2: S_IFCHR mode:0620 dev:336,0 ino:12582946 uid:1010 gid:7 rdev:24,15
- O_RDWR|O_NOCTTY|O_LARGEFILE
- /devices/pseudo/pts@0:15
- 3: S_IFREG mode:0644 dev:32,39 ino:72743 uid:1010 gid:101 size:0
- O_WRONLY|O_CREAT|O_TRUNC
- /export/home1/lbs/my.txt
- 4: S_IFIFO mode:0000 dev:344,0 ino:30884132 uid:1010 gid:101 size:0
- O_RDWR
- thFork is done
- Main is done
复制代码
[ 本帖最后由 timespace 于 2009-4-16 22:51 编辑 ] |
|