作者amu1661024 (人生游戏 戏游人生)
看板LinuxDev
标题[问题] 很诡异的现象...= =
时间Sun Dec 20 17:23:32 2009
继刚刚问有好心大大 帮我解了gets之後
我写了一个 读取者锁-写入者锁 的程式
程式码如下(先说好 不是要帮我debug 这编译有通过
只是在执行时gets的地方好像会跳掉):
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#define SIZE 100 //Set the input buffer size = 100
int main(int fd)
{
char input[SIZE];
char c;
struct flock fl;
FILE *fin,*fout;
int choose;
printf("------------Menu------------\n");
printf("1.WL\n2.RL\n3.Unlock\n");
printf("Enter your choose: ");
scanf("%d",&choose);
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 0; //EOF
fl.l_pid = getpid();
switch(choose){
case 1:
fl.l_type = F_WRLCK; //write lock
fout = fopen("file","w");
fd = fileno(fout);
fcntl(fd, F_SETLKW, &fl); //write lock fd
printf("Input the string: ");
gets(input);
fputs(input,fout);
break;
case 2:
fl.l_type = F_RDLCK; //read lock
fin = fopen("file","r");
fd = fileno(fin);
fcntl(fd, F_SETLKW, &fl); //read lock fd
printf("The string be read is: ");
while((c = fgetc(fin)) != EOF)
printf("%c",c);
printf("\nWait for 5 seconds...\n");
sleep(5);
break;
default:
fl.l_type = F_UNLCK; //unloock
fd = fileno(fout);
fout = fopen("file","w");
fcntl(fd, F_SETLKW, &fl);
printf("Input the string: ");
gets(input);
fputs(input,fout);
break;
}
fl.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &fl); //unlock fd
return 0;
}
执行时如下:
$ ./proc.o file
------------Menu------------
1.WL
2.RL
3.Unlock
Enter your choose: 1
Input the string: $
搞不懂为何会降子 上一篇的程式执行起来就没有这问题
另外 如果将程式中的gets(input); 改成scanf("%s",input); 就没有此问题
缺点是 不能输入空白键 不然它只能读到句子中的第一个单字
今天难得会上来问两篇
谢谢回答
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.240.190.163
※ 编辑: amu1661024 来自: 123.240.190.163 (12/20 17:25)
1F:推 carlcarl:也许是\n的问题? 12/20 17:28
2F:→ amu1661024:意思就是说我的gets再我按键盘之前就先读到\n罗? 12/20 17:32
3F:→ amu1661024:不过我真的看不出程式中有什麽地方能让他读到\n 12/20 17:34
4F:推 carlcarl:scanf("%d%*c",&choose); 这样咧? 12/21 00:43
5F:推 kerickuo:是 \n 的问题没错 12/21 17:41
6F:→ amu1661024:喔 我懂了 因为之前再按scanf时的enter被保留下来 12/21 21:04
7F:→ amu1661024:所以之後gets会先读到\n 12/21 21:05
8F:→ amu1661024:再gets下面再用一次gets果然可以 谢谢楼上诸位大大 12/21 21:13