msk@afinitc.UUCP (12/06/84)
I have received these seven responses to my original question on how to redirect output to/from file descriptors other than 0 (stdin), 1 (stdout), and 2 (stderr). Thank you all for your helpful information! --------------- ark@grigg says: --------------- #include <stdio.h> FILE *file3; file3 = fdopen (3, "w"); if (file3 == NULL) { /* complain */ } fprintf (file3, ...); ------------------ jeff@alberta says: ------------------ Try the dup2(2) system call. That should do it. ---------------- mike@whuxl says: ---------------- You can use any system calls directly on them. This includes raw I/O (read, write), dup, ioctl, fcntl, lseek, close, etc. Just say write(3, "hello", 5); for instance. If you want to use the normal stdio routines, create a FILE pointer to it using fdopen(): FILE *fp; fp = fdopen(3, "w"); fprintf(fd, "blick is %d\n", blick); ... If you use "... 3< file ..." on the command line, use "r" as the type on fdopen. ... the shell allows only single-digit fd's ... ------------------- keesan@bbncca says: ------------------- Simply do I/O to the desired file descriptor as if you had opened it within your program. E.g. main(){write(3,"Hello, world\n",13);} If you want to use stdio, then just insert FILE *fp3; fp3 = fdopen(3,"w"); into your program and use fwrite or putc to FILE fp3. What is happening is that when you say command 3>foo to the shell, the shell opens file "foo" for writing, with file descriptor 3, and then executes the command as a child process, which inherits all of the open files belonging to its parent (the shell). --------------- ado@elsie says: --------------- If you're on a Berkeley system, the function call fdopen(3, "w"); returns a FILE pointer that can be used to write to the file associated with file descriptor 3. See the manual page on "fopen" in section three of the Programmer's Manual for details. If you're not on a Berkeley system, I don't know of a portable way to do it. Here's a version of "fdopen" that might work on most systems, though: #include <stdio.h> FILE * fdopen(fildes, type) char * type; { register FILE * fp; fp = fopen("/dev/null", type); if (fp == NULL) return NULL; close(fp->_file); fp->_file = fildes; return fp; } ------------------- davidt@ttidca says: ------------------- Use Bourne shell, not C shell. Just something like prog 3>/dev/tty to shell and write(3, "hello!!!", 8); in C program works fine. --------------- dpg@busch says: --------------- file descriptors are preserved across forks and execs, so all you need to insure is that the descriptor for your file has a specific value. The dup2(2) call does this, so int fd, pid if ((fd=open("myfile", mode)) < 0) terminate(); switch (pid=fork()) { case -1: terminate(); case 0: /* child */ dup2(fd, 3) exec(program, ...); terminate(); /* couldn't exec */ default: /* parent */ break; } -- -- From the terminal of Morris Kahn (...ihnp4!wucs!afinitc!msk) -- Affinitec, Corp., 2252 Welsch Ind. Ct., St. Louis, MO 63146 (314)569-3450