how to prevent deadlock on this...


 
Thread Tools Search this Thread
Top Forums Programming how to prevent deadlock on this...
# 1  
Old 10-11-2005
Data how to prevent deadlock on this...

I am using linux termios structure to configure serial port and read the port by read function. For some reason, if I read the whole buffer, almost every time the buffer does not contain the correct reply message sequence from a device sending reply to my linux PC. So I use "while(!read_start(fd,0x01));" to wait the first legal byte in the reply and read byte by byte. The problem is sometime the user forget to power on the device so it will cause deadlock. I am no expert in linux. Can someone give suggestion about how to: set a timer and if time out, the current program will be killed or exit incorrectly while waiting the first byte?
# 2  
Old 10-11-2005
Use the select() system call to wait for the fd to become readable. You can specify a timeout to select and the return code tells you what happened. Then read the entire expected number of bytes. You will probably get too few. So read the rest. Continue until you have all the bytes you need. Reading a byte at a time is not very efficient. If needed you can use select() in front of each read() so that the program never hangs on a read.
# 3  
Old 10-11-2005
Perderabo, thanks a lot.

After select() and if(FD_ISSET(fd, &rfds)), then I read the buffer. As you mentioned, I only can read 8 bytes one time (my full reply message is 13 bytes) by "result1=read(fd,buffer,13);" (result1=8). After I read these 8 bytes, I have to read the buffer one byte after another to get correct message. If I use "result2=read(fd,buffer1,13)" after first 8 bytes read, result2 always is 0. Is there anyway I can use multiple block reads to get a full message? Or how can I get one read more than 8 bytes in my case in one read?
# 4  
Old 10-11-2005
Post your code for this section.." if(FD_ISSET(fd, &rfds)),' does not sound right

Do a second select before you do the second read. Do a select before each read.
# 5  
Old 10-11-2005
The code:
Code:
/////////////////////////////////////////////////////////////////////////////
			        tv.tv_sec = 3;    /*3 second*/
			        tv.tv_usec = 0;
				FD_ZERO(&rfds);
				FD_SET(fd, &rfds);  
/*fd=open("/dev/ttyS0",O_RDWR|O_NDELAY|O_NOCTTY)*/

				retval = select(FD_SETSIZE, &rfds, NULL, NULL, &tv);

				if (retval == -1)
					printf("select error\n");
			        else if (retval){
					if(FD_ISSET(fd, &rfds)){
						int result1=0;
						int result2=0;
						result1=read(fd,buffer,13); /*result1 is always 8*/
/*if I put another read here:result2=read(fd,buffer1,13), result2 is always 0*/
						usleep(100);
						for (i=result1;i<13;i++){   /* have to read the rest bytes, one byte at a time*/
							usleep(100);
							result2=read(fd,cc,1);
							buffer[i]=cc[0];	
						}
/////////////////////////////////////////////////////


Last edited by Perderabo; 10-11-2005 at 08:09 PM.. Reason: Add code tags for readability
# 6  
Old 10-11-2005
You are setting the O_NDELAY flag on the open(). That is a bad idea for several reasons. The newer O_NONBLOCK flag corrects a problem with O_NDELAY. Use O_NONBLOCK for new code. Setting either flag means that the open() call itself will not hang. But subsequent operations on the fd are being affected. Posix says, about O_NONBLOCK, "When opening a block special or character special file that supports non-blocking opens: Subsequent behavior of the device is device-specific." The Linux man page says, "Neither the open nor any subsequent operations on the file descriptor which is returned will cause the calling process to wait".

These flags are affecting read(). The read will return immediately if no characters are available. The old O_NDELAY will return a zero in this case. That is the same thing EOF would return... this is the problem with that flag. If O_NONBLOCK is set, -1 is returned with errno set to EAGAIN.

So my advice: use O_NONBLOCK for the open and then turn it off... something like this:
flags=fcntl(fd, F_GETFL, 0);
flags &= ~O_NONBLOCK;
fcnt(fd, F_SETFL,flags);

Next, you mention that you are setting termios paramters. Take a look at CMIN and CTIME. You can use them to control when the read returns. That means you can get rid of select().

You may still need to do more than one read. Use an overall loop...something like:
Code:
nbytes=16;
nreads=5;
ptr=buffer;
for (nreads=5; nbytes && nreads; nreads--)  {
        iret = read(fd, ptr, nbytes);
        if (iret > 0) {
                ptr += iret;
                nbytes -= iret;
        }
}

Of course, you will need to check the sys calls for failure. I'm just sketching in the basic flow, not writing real code.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Emergency UNIX and Linux Support

How to prevent emails as spam?

If an email is sent from our application server(running on AIX) to an id that is outside of the organization like gmail etc, and if gmail should not treat the mail as spam, what has to be done from unix level? (7 Replies)
Discussion started by: ggayathri
7 Replies

2. UNIX for Advanced & Expert Users

How to prevent Accidents 'rm -rf *'?

When invoking unix commands from other third party tools (IBM ETL), we run the rm / mv commands with the folder as argument been passed. Eg rm -rf {folder}/* when the parameter {folder} did not pass rightly or becomes blank, the command becomes dangerous to execute rm -rf /* How to prevent... (9 Replies)
Discussion started by: deepakwins
9 Replies

3. Shell Programming and Scripting

How to prevent command from deleted

Hi, I've been searching around for solution, hope that some gurus here can help. I'm using some commands in my shell script and I'd like to protect these command to be moved to another directory. For instance, cp currently in /bin/cp. If I move it to /bin/cpxxx, my script will not be able to... (3 Replies)
Discussion started by: gklntn
3 Replies

4. Shell Programming and Scripting

how to prevent process from being killed

Hi,all.Well,I know someone has already asked this question before,however,It's too long before.So i post a new thread here. Here is the issue.I have a shell script that use awk to calculate something and the script takes about 15 mins,it will use 100% CPU,and the system automatically killed the... (2 Replies)
Discussion started by: homeboy
2 Replies

5. UNIX for Dummies Questions & Answers

How to prevent queues from disabling themselves

I understand that on my HP-UX 11.31 system when print queues can no longer communicate with remote printers, the queue disables itself. How can I configure it to stop disabling itself, or alternatively, to re-enable itself when the remote printer comes back online? I have users in warehouses who... (6 Replies)
Discussion started by: EatenByAGrue
6 Replies

6. UNIX for Advanced & Expert Users

Parallel access - how to prevent

I have one shell script which is being accessed by many jobs at same time. I want to make the script such that , other job should wait for the script if script is being used by some other job. Is there any way to implement it in script level ? Gops (1 Reply)
Discussion started by: Gopal_Engg
1 Replies

7. UNIX for Dummies Questions & Answers

Deadlock

Hi All, how to find which all processes cause deadlock into the system and how we can resolve in Unix platform. (1 Reply)
Discussion started by: ravi.sadani19
1 Replies

8. UNIX for Dummies Questions & Answers

Please help about Unix Deadlock

hello guy, i really have a hard time complete one of my school paper. Does anyone how Unix deal with Deadlock situation. ><; Description or theory is good enough. ^^". Thank you for your kindness, Jaideej (1 Reply)
Discussion started by: jaideej
1 Replies

9. Programming

How to prevent a class from inheretance?

:(Hi, There is a class in C++ called "CL". It should not participate in inheretance. If some body inherit it it should give errors.....:( (0 Replies)
Discussion started by: krishna_sicsr
0 Replies

10. HP-UX

how to check whether a script is running actively or hanged/ in deadlock)

Hi I have a doubt regarding process states in HP unix system. Is there a way to check whether a process is hanged or still actively running? I have few scripts which run for a long time. but sometimes these are getting hanged. But i'm never sure whether they are running or waiting in kind of... (4 Replies)
Discussion started by: truth
4 Replies
Login or Register to Ask a Question