69,371
社区成员
发帖
与我相关
我的任务
分享
write_lock(1, "parent try to lock!");/*fork之前,先锁第一个字节*/
pid = fork();
if (pid < 0) {
fprintf(stdout, "fork error!\n");
return -1;
}
else if (pid == 0) {
for (i = 0; i < 5; i++) {
write_lock(1, "child try to lock!\n");
dosomething();
un_lock(1);
}
exit(0);
}
else if (pid > 0) {
for (i = 0; i < 5; i++) {
write_lock(1, "parent try to lock!");
do_something();
un_lock(1);
}
}
int un_lock(int pos)
{
struct flock lock;
lock.l_type = F_UNLCK;
lock.l_start = pos;
lock.l_whence = SEEK_SET;
lock.l_len = 1;
if (fcntl(fd, F_SETLK, &lock)) {
printf("fcntl to unlock %d ERROR!\n", pos);
}
}
int write_lock(int start, char* memo)
{
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_start = start;
lock.l_whence = SEEK_SET;
lock.l_len = 1;
printf("%s\n", memo);
if (fcntl(fd, F_SETLKW, &lock)) {
perror("fcntl to lock ERROR!\n");
printf("error:%s\n", memo);
}
else printf("lock success!\n");
return 0;
}
pid = fork();
if (pid < 0) {
fprintf(stdout, "fork error!\n");
return -1;
}
else if (pid == 0) {
for (i = 0; i < 5; i++) {
write_lock(1, "child try to lock!\n");
childsay(fp);
un_lock(1);
}
exit(0);
}
else if (pid > 0) {
for (i = 0; i < 5; i ++) {
un_lock(1);
write_lock(1, "parent try to lock!\n");
parentsay(fp);
}
}
[1]我是子进程[31367],春眠不觉晓
child try to lock!
[2]我是子进程[31367],春眠不觉晓
child try to lock!
[3]我是子进程[31367],春眠不觉晓
child try to lock!
[4]我是子进程[31367],春眠不觉晓
child try to lock!
[5]我是子进程[31367],春眠不觉晓
[6]我是父进程[31366],处处蚊子咬
parent try to lock!
[7]我是父进程[31366],处处蚊子咬
parent try to lock!
[8]我是父进程[31366],处处蚊子咬
parent try to lock!
[9]我是父进程[31366],处处蚊子咬
parent try to lock!
[10]我是父进程[31366],处处蚊子咬