aboutsummaryrefslogtreecommitdiff
path: root/man/man3/ioproc.html
blob: 092bac91fcc8e2c5dec8296f2441fe4fd6eeab36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<head>
<title>ioproc(3) - Plan 9 from User Space</title>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
</head>
<body bgcolor=#ffffff>
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=10><td>
<tr><td width=20><td>
<tr><td width=20><td><b>IOPROC(3)</b><td align=right><b>IOPROC(3)</b>
<tr><td width=20><td colspan=2>
    <br>
<p><font size=+1><b>NAME     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    closeioproc, iocall, ioclose, iointerrupt, iodial, ioopen, ioproc,
    ioread, ioread9pmsg, ioreadn, iorecvfd, iosendfd, iosleep, iowrite
    &ndash; slave I/O processes for threaded programs<br>
    
</table>
<p><font size=+1><b>SYNOPSIS     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>


<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <tt><font size=+1>#include &lt;u.h&gt;<br>
    #include &lt;libc.h&gt;<br>
    #include &lt;thread.h&gt;<br>
    typedef struct Ioproc Ioproc;<br>
    Ioproc* ioproc(void);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioclose(Ioproc *io, int fd);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iodial(Ioproc *io, char *addr, char *local, char *dir, char
    *cdfp);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioopen(Ioproc *io, char *file, int omode);<br>
    long &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioread(Ioproc *io, int fd, void *a, long n);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioread9pmsg(Ioproc *io, int fd, void *a, uint n);<br>
    long &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ioreadn(Ioproc *io, int fd, void *a, long n);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iorecvfd(int socket);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iosendfd(int socket, int fd);<br>
    int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iosleep(int milli);<br>
    long &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iowrite(Ioproc *io, int fd, void *a, long n);<br>
    void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iointerrupt(Ioproc *io);<br>
    void &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeioproc(Ioproc *io);<br>
    long &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iocall(Ioproc *io, long (*op)(va_list *arg), ...);<br>
    </font></tt>
</table>
<p><font size=+1><b>DESCRIPTION     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>


<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    These routines provide access to I/O in slave procs. Since the
    I/O itself is done in a slave proc, other threads in the calling
    proc can run while the calling thread waits for the I/O to complete.
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    <i>Ioproc</i> forks a new slave proc and returns a pointer to the <tt><font size=+1>Ioproc</font></tt>
    associated with it. <i>Ioproc</i> uses <i>mallocz</i> and <i>proccreate</i>; if either
    fails, it calls <i>sysfatal</i> rather than return an error. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    <i>Ioclose</i>, <i>iodial</i>, <i>ioopen</i>, <i>ioread</i>, <i>ioread9pmsg</i>, <i>ioreadn</i>, <i>iorecvfd</i>,
    <i>iosendfd</i>, <i>iosleep</i>, and <i>iowrite</i> execute the similarly named library
    or system calls (see <a href="../man2/close.html"><i>close</i>(2)</a>, <a href="../man3/dial.html"><i>dial</i>(3)</a>, <a href="../man3/open.html"><i>open</i>(3)</a>, <a href="../man3/read.html"><i>read</i>(3)</a>, <a href="../man3/fcall.html"><i>fcall</i>(3)</a>,
    <a href="../man3/sendfd.html"><i>sendfd</i>(3)</a>, and <a href="../man3/sleep.html"><i>sleep</i>(3)</a>) in the slave process associated with
    <i>io</i>. It is an error to execute more than one call at a time in
    an I/O
    proc. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    <i>Iointerrupt</i> interrupts the call currently executing in the I/O
    proc. If no call is executing, <i>iointerrupt</i> is a no-op. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    <i>Closeioproc</i> terminates the I/O proc and frees the associated <tt><font size=+1>Ioproc
    . 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    </font></tt>
    <i>Iocall</i> is a primitive that may be used to implement more slave
    I/O routines. <i>Iocall</i> arranges for <i>op</i> to be called in <i>io</i>&#8217;s proc,
    with <i>arg</i> set to the variable parameter list, returning the value
    that <i>op</i> returns.<br>
    
</table>
<p><font size=+1><b>EXAMPLE     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    Relay messages between two file descriptors, counting the total
    number of bytes seen:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>int tot;<br>
        void<br>
        relaythread(void *v)<br>
        {<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            int *fd, n;<br>
            char buf[1024];<br>
            Ioproc *io;<br>
            fd = v;<br>
            io = ioproc();<br>
            while((n = ioread(io, fd[0], buf, sizeof buf)) &gt; 0){<br>
             if(iowrite(io, fd[1], buf, n) != n)<br>
              sysfatal(&quot;iowrite: %r&quot;);<br>
             tot += n;<br>
            }<br>
            closeioproc(io);<br>
            
        </table>
        }<br>
        void<br>
        relay(int fd0, int fd1)<br>
        {<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            int fd[4];<br>
            fd[0] = fd[3] = fd0;<br>
            fd[1] = fd[2] = fd1;<br>
            threadcreate(relaythread, fd, 8192);<br>
            threadcreate(relaythread, fd+2, 8192);<br>
            
        </table>
        }<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
        </font></tt>
        
    </table>
    If the two <i>relaythread</i> instances were running in different procs,
    the common access to <i>tot</i> would be unsafe. 
    <table border=0 cellpadding=0 cellspacing=0><tr height=5><td></table>
    
    Implement <i>ioread</i>:<br>
    
    <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

        <tt><font size=+1>static long<br>
        _ioread(va_list *arg)<br>
        {<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            int fd;<br>
            void *a;<br>
            long n;<br>
            fd = va_arg(*arg, int);<br>
            a = va_arg(*arg, void*);<br>
            n = va_arg(*arg, long);<br>
            return read(fd, a, n);<br>
            
        </table>
        }<br>
        long<br>
        ioread(Ioproc *io, int fd, void *a, long n)<br>
        {<br>
        
        <table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

            return iocall(io, _ioread, fd, a, n);<br>
            
        </table>
        }<br>
        </font></tt>
    </table>
    
</table>
<p><font size=+1><b>SOURCE     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <tt><font size=+1>/usr/local/plan9/src/libthread<br>
    </font></tt>
</table>
<p><font size=+1><b>SEE ALSO    </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <a href="../man3/dial.html"><i>dial</i>(3)</a>, <a href="../man3/open.html"><i>open</i>(3)</a>, <a href="../man3/read.html"><i>read</i>(3)</a>, <a href="../man3/thread.html"><i>thread</i>(3)</a><br>
    
</table>
<p><font size=+1><b>BUGS     </b></font><br>

<table border=0 cellpadding=0 cellspacing=0><tr height=2><td><tr><td width=20><td>

    <i>Iointerrupt</i> is currently unimplemented.<br>
    
</table>

<td width=20>
<tr height=20><td>
</table>
<!-- TRAILER -->
<table border=0 cellpadding=0 cellspacing=0 width=100%>
<tr height=15><td width=10><td><td width=10>
<tr><td><td>
<center>
<a href="../../"><img src="../../dist/spaceglenda100.png" alt="Space Glenda" border=1></a>
</center>
</table>
<!-- TRAILER -->
</body></html>