Date: Wed, 11 Aug 1999 06:34:22 -0700 (PDT) From: kwchen@lucent.com To: freebsd-gnats-submit@freebsd.org Subject: kern/13075: signal is not posted for async I/O on raw devices Message-ID: <19990811133422.4197A14D2E@hub.freebsd.org>
index | next in thread | raw e-mail
>Number: 13075
>Category: kern
>Synopsis: signal is not posted for async I/O on raw devices
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Wed Aug 11 06:40:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator: K. Herman Chen
>Release: FreeBSD 3.2-RELEASE #6
>Organization:
Lucent Technologies
>Environment:
FreeBSD marlin 3.2-RELEASE FreeBSD 3.2-RELEASE #6: Mon Jul 19
16:16:40 EDT 1999 lin@tampa:/usr/src/sys/compile/SMASH-CS-32 i386
>Description:
The following program (~60 lines) does not get a SIGUSR1 when used with a raw device,
but does get the signal with a block device. It will wait forever for a
signal (pause()); doing "kill -30 <pid>" from shell prompt will cause it
to execute sigusr1() and display the data it just read and the data seemed
correct.
BTW, how do I identify a specific AIO job with each signal? Are signals
queued in FreeBSD? Thanks very much.
#include <stdio.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <time.h>
#include <aio.h>
aiocb_t myaiocb;
siginfo_t siginfo;
char buf[10240];
sig_t
sigusr1(int signo)
{
int i;
printf("in sigusr1(), signo = %d\n", signo);
printf("aio_error(myaiocb): %d\n", aio_error(&myaiocb));
#if 0
printf("aio buffer after read: %s\n", buf);
for (i = 0; i < 500; i++) printf(" %c", buf[i]);
printf("\n");
}
main(argc, argv)
int argc;
char** argv;
{
int rtn;
int fd;
/* signal is not posted on raw partition, but okay on block device */
fd = open("/dev/rwd0s4e", O_RDONLY);
/* fd = open("/dev/wd0s4e", O_RDONLY); this works. */
if (fd < 0) {
perror("open failed");
exit(1);
}
printf("open succeeded ...\n");
signal(SIGUSR1, (sig_t) sigusr1);
myaiocb.aio_fildes = fd;
myaiocb.aio_buf = buf;
myaiocb.aio_nbytes = 2048;
myaiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
myaiocb.aio_sigevent.sigev_signo = SIGUSR1;
myaiocb.aio_sigevent.sigev_value.sival_int = 123;
printf("calling aio_read ...\n");
rtn = aio_read(&myaiocb);
if (rtn < 0) {
perror("aio_read failed");
exit(1);
}
printf("aio_read succeeded\n");
/* normally get EINPROGRESS */
printf("aio_error(myaiocb): %d\n", aio_error(&myaiocb));
pause();
}
>How-To-Repeat:
The above program will wait forever for a signal.
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19990811133422.4197A14D2E>
