Hey guys. I'm very new to Unix. I'm pretty fluent in Java and C, but I have never actually used Unix for anything. I am in an Operating Systems course now and I have an assignment to write a piece of code that involves forks and piping. I'm stuck.
... ... ...
... ... ...
Now I realize that I do not have the reverse thing in there, nor do I have the Welcome and goodbye message. I'm just trying to figure out where things go and how they really work.
When I run what I currently have, it lists what my "ls" would list in normal order. It also locks up and doesn't ever seem to really finish, and I can't do anything without disconnecting.
Like I said, new to Unix.. any help would be appreciated. Thanks.
Please use CODE tags. (I've added them in the text I quoted from your posting.)
Here are a few hints:
Since you're using, but not declaring pid this code shouldn't even compile let alone hang when you run it.
You need to close fd 1 in the child before calling dup2 (so that the output from ls is redirected into the write end of the pipe. Then you need to close both of the original pipe file descriptors in the child before exec'ing ls.
In the parent, you need to close the write end of the pipe.
If you don't want ls to hang waiting for the pipe to drain, you need to read the data in the parent that is written by the child.
Don't wait in the parent for the child to exit until you've hit EOF on the data being written by the child.
Check the function call return codes to verify that the functions you call return successfully. Especially when learning how to use functions that are new to you, the return codes (and the value of errno [see also perror()]) will frequently tell you what to look for when things go wrong.
All,
I am a UNIX novice with a question that I hope you can help me with.
I have a UNIX application called "Tole" that formats and displays specific information about customers. I can display the information for up to 30 customers by seperating customer IDs using commas in this format:
Tole -c... (3 Replies)
i am writing a script to perform some mysqldumps and gzip them. The problem I am running into is that if the user specifies a database that doesn't exist, the error the mysql engine produces is still piped into gzip, and the exit code returned is 0. If I don't pipe into gzip, an exit code... (4 Replies)
Hi,
To explain this question I will have to go into a bit of detail. I hope you don't mind.
currently I have a log handler (an already compiled c++ version) and what it does is makes a log file and writes all the unix output (echo, etc) of a script to that log file. To me the log_handler is... (3 Replies)
Hi,
I'm trying to wrap my head around piping in C - I've got a small C program that forks and pipes stuff from the child process to the parent process.
Currently the child process calls a C program that squirts out random numbers which then pipes the result to the parent process.
The... (0 Replies)
I am trying to have a script run without interaction from the command line. So in my script i have a line like this
echo -e "\n\n\ny\ny\n" | ./script
the goal being the ability to mimic 3 Enter presses and 2 'y/n' responses with 'y' followed by enter.
For some reason tho, it is not... (1 Reply)
Hi friends
I have a zip file 1.zip which contains three text files a.txt b.txt c.txt
I want to grep some text(keyword) in those 3 files without extracting all the three files to a local directoryusing the command,
unzip -p 1.zip |grep "search text" >result.txt
The Output file is... (2 Replies)
I'm trying to pipe the output from a command into another using xargs but is not getting what I want. Running this commands:
find . -name '33_cr*.rod' | xargs -n1 -t -i cut -f5 {} | sort -k1.3n | uniq | wc -l
give the following output:
cut -f5 ./33_cr22.rod
cut -f5 ./33_cr22.rod
...
9224236... (7 Replies)
Hey,
I want to create a new file (devices) with the 39th and the 40th character of the line wich is in the array line and in the file drivers.
But unfortunately my try doesn't work:
sed -n '$linep' drivers | cut -c 39-40 | echo >>devices Perhaps one of you can help me. Thank you!
emoly
... (0 Replies)
Hi ,
I have following code in my shell script :
"$TS_BIN/tranfrmr" "${TS_SETTINGS}/tranfrmr_p1.stx" "${TS_LOGS}/tranfrmr_p1.err" | (
"$TS_BIN/cusparse" "${TS_SETTINGS}/cusparse_p2.stx" "${TS_LOGS}/cusparse_p2.err" | (
"$TS_BIN/tsqsort" "${TS_SETTINGS}/srtforpm_p3.stx"... (8 Replies)
Discussion started by: sonu_pal
8 Replies
LEARN ABOUT LINUX
pipe
PIPE(2) Linux Programmer's Manual PIPE(2)NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
int pipe(int pipefd[2]);
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <unistd.h>
int pipe2(int pipefd[2], int flags);
DESCRIPTION
pipe() creates a pipe, a unidirectional data channel that can be used for interprocess communication. The array pipefd is used to return
two file descriptors referring to the ends of the pipe. pipefd[0] refers to the read end of the pipe. pipefd[1] refers to the write end
of the pipe. Data written to the write end of the pipe is buffered by the kernel until it is read from the read end of the pipe. For fur-
ther details, see pipe(7).
If flags is 0, then pipe2() is the same as pipe(). The following values can be bitwise ORed in flags to obtain different behavior:
O_NONBLOCK Set the O_NONBLOCK file status flag on the two new open file descriptions. Using this flag saves extra calls to fcntl(2) to
achieve the same result.
O_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the two new file descriptors. See the description of the same flag in open(2) for
reasons why this may be useful.
RETURN VALUE
On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
ERRORS
EFAULT pipefd is not valid.
EINVAL (pipe2()) Invalid value in flags.
EMFILE Too many file descriptors are in use by the process.
ENFILE The system limit on the total number of open files has been reached.
VERSIONS
pipe2() was added to Linux in version 2.6.27; glibc support is available starting with version 2.9.
CONFORMING TO
pipe(): POSIX.1-2001.
pipe2() is Linux-specific.
EXAMPLE
The following program creates a pipe, and then fork(2)s to create a child process; the child inherits a duplicate set of file descriptors
that refer to the same pipe. After the fork(2), each process closes the descriptors that it doesn't need for the pipe (see pipe(7)). The
parent then writes the string contained in the program's command-line argument to the pipe, and the child reads this string a byte at a
time from the pipe and echoes it on standard output.
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{
int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>
", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[1]); /* Close unused write end */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "
", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Parent writes argv[1] to pipe */
close(pipefd[0]); /* Close unused read end */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Reader will see EOF */
wait(NULL); /* Wait for child */
exit(EXIT_SUCCESS);
}
}
SEE ALSO fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)COLOPHON
This page is part of release 3.27 of the Linux man-pages project. A description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2010-09-10 PIPE(2)