01-23-2011
Remember that the reader is expected to use only those concepts introduced so far in the book. So there is no reason to think about exotic solutions. This is why I think that looping on dup() is the answer Rich was looking for. Remember to clean up after the dup loop. I don't see the dup loop as a real terrible problem... it just seems that way because we are mentally comparing it to the real dup2.
It's off the subject, but here is a worse example of looping... around 1990 I was sysadmin of a Vax running Ultrix. We had some game (rogue maybe?) where you could save your status and then do a restore if you "died", but only during the current run. The game stored the pid in the save file and the restore would fail if the current pid was different. So one of our programmers wrote an "allocate_pid" function.
Guess how it worked. And this was before today's fast fork.
10 More Discussions You Might Find Interesting
1. UNIX for Dummies Questions & Answers
I want to implement my own simple multi tasking shell in Unix which will take care of redirection (<, >, >>) and piping.
I am just unable to get a concrete idea of how exactly I have to start. I have several books...some are..
1. Maurice Bach- Design Of Unix Operating System
2. Richard... (3 Replies)
Discussion started by: clickonline1
3 Replies
2. Programming
I'm having difficulty understanding the purposes of using dup/dup2 when involving forks.
for example, if we call fork() once, that is, we are creating a child process. In what cases would we need to use dup or dup2 to duplicate the file descriptors for standard output and standard error? What... (1 Reply)
Discussion started by: Yifan_Guo
1 Replies
3. Programming
Hi,
i have in one program such a pice of code
................
static int old_stderr_handle = -1;
static int old_stdout_handle = -1;
log_handle = open(log_file_name,O_CREAT|O_RDWR,932);
old_stderr_handle = dup(STDERR_FILENO);
if (dup2(log_handle,STDERR_FILENO) < 0)
{
//... (1 Reply)
Discussion started by: vovan
1 Replies
4. UNIX for Advanced & Expert Users
int redirect()
{
int fd,rc;
fd = open("sample.DAT",O_CREAT | O_RDWR , 00777 );
rc = dup2(fd , 1 ) ;
close (fd );
return 0;
}
I used the above to redirect all the cout statements to sample.DAT. process is redirecting the output and I had two questions
1. All stdout/cout statements... (2 Replies)
Discussion started by: satish@123
2 Replies
5. UNIX for Advanced & Expert Users
Hey Guys
Some of my friends have got together and we are trying to write a basic kernel similar to Linux. I am trying to implement the malloc function in C and I am using a doubly linked list as the primary data structure. I need to allocate memory for this link list (duh...) and I don't feel... (2 Replies)
Discussion started by: rbansal2
2 Replies
6. Linux
Hi
I'm trying to implement CAPWAP protocol for my application.i'm able to configure my server side but i'm getting error at client(WTP) side as IOCTL error.while running the command
#./WTP /mnt/cf/capwap/
: wlan2
Starting WTP...
# WTP Loads... (0 Replies)
Discussion started by: ran789
0 Replies
7. UNIX for Dummies Questions & Answers
Hi everybody,
i've been googling for ages now and gotten kinda desperate... The question, however, might be rather trivial for the experts: What is it exactly, i.e. physically, the POSIX function (for a file) "lseek" does? Does it trigger some kind of synchronization on disk? Is it just for the... (4 Replies)
Discussion started by: Humudituu
4 Replies
8. UNIX for Advanced & Expert Users
is it possible to duplicate file descriptors(opened by a different process) with the help of dup or dup2. the two process do not share parent child relationship as well. (2 Replies)
Discussion started by: replytoshishir
2 Replies
9. Shell Programming and Scripting
I want to execute metasploit by two pipes to communicate with it, but I have troubles with that communication. When I run my program, I get this error: "stty: standard input: Inappropriate ioctl for device" and I don't receive the metasploit promt.
just select an exploit.
This is my code:... (2 Replies)
Discussion started by: dano88
2 Replies
10. Programming
What this code should do is: there are parent.cpp and child.cpp. Parent will send whatever is in the buffer to child and child will send back whatever received to parent. I do not know what I am doing wrong. I am confused what is missing in the parent and what else I should include into the child.... (1 Reply)
Discussion started by: ramono
1 Replies
DUP(2) BSD System Calls Manual DUP(2)
NAME
dup, dup2 -- duplicate an existing file descriptor
LIBRARY
Standard C Library (libc, -lc)
SYNOPSIS
#include <unistd.h>
int
dup(int oldd);
int
dup2(int oldd, int newd);
DESCRIPTION
The dup() system call duplicates an existing object descriptor and returns its value to the calling process (newd = dup(oldd)). The argument
oldd is a small non-negative integer index in the per-process descriptor table. The value must be less than the size of the table, which is
returned by getdtablesize(2). The new descriptor returned by the call is the lowest numbered descriptor currently not in use by the process.
The object referenced by the descriptor does not distinguish between oldd and newd in any way. Thus if newd and oldd are duplicate refer-
ences to an open file, read(2), write(2) and lseek(2) calls all move a single pointer into the file, and append mode, non-blocking I/O and
asynchronous I/O options are shared between the references. If a separate pointer into the file is desired, a different object reference to
the file must be obtained by issuing an additional open(2) system call. The close-on-exec flag on the new file descriptor is unset.
In dup2(), the value of the new descriptor newd is specified. If this descriptor is already in use and oldd != newd, the descriptor is first
deallocated as if the close(2) system call had been used. If oldd is not a valid descriptor, then newd is not closed. If oldd == newd and
oldd is a valid descriptor, then dup2() is successful, and does nothing.
RETURN VALUES
The value -1 is returned if an error occurs in either call. The external variable errno indicates the cause of the error.
ERRORS
The dup() and dup2() system calls fail if:
[EBADF] The oldd or newd argument is not a valid active descriptor
[EMFILE] Too many descriptors are active.
SEE ALSO
accept(2), close(2), fcntl(2), getdtablesize(2), open(2), pipe(2), socket(2), socketpair(2)
STANDARDS
The dup() and dup2() system calls are expected to conform to ISO/IEC 9945-1:1990 (``POSIX.1'').
HISTORY
The dup() and dup2() functions appeared in Version 7 AT&T UNIX.
BSD
June 4, 1993 BSD