You made a pretty good try at it, but it's tricky. My comments:
Code:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
int main(){
int piped[2];//pipe descriptors
char buf[16 * 1024];
pid_t child;
if(pipe(piped)<0){
fprintf(stderr,"pipe creation failed \n");
exit(-1);
}
if((child = fork()) < 0){
fprintf(stderr,"process creation failed \n");
exit(-1);
}
else if(child == 0){
close(piped[1]);//close the write end of child
// You don't need to close stdin, dup2() does that.
close(0);//close stdin
if((dup2(piped[0],0)) < 0){//duplicate read end with stdin;
fprintf(stderr,"duplication of pipe desc failed \n");
exit(-1); // exit only takes positive values.
}
// Why are you reading from the pipe? that's wc's job.
int linesrd = read(piped[0],buf,sizeof(buf));
printf("The noof bytes read are %d \n",linesrd);
if(linesrd < 0)
fprintf(stderr,"Read error \n");
// how could strlen() possibly tell you the length of a string that
// doesn't already have a null terminator?? Just use 'linesrd'.
buf[strlen(buf)-1] = '\0';
// Just give execlp buf directly, no need to make another pointer
// to the exact same memory.
char *buf1 = buf;
// Feeding wc another commandline parameter tells it to
// read from the file NAMED that. It won't read from stdin.
execlp("wc","wc","-l",buf1,NULL);
//exit(1);
}
else{
close(piped[0]);//close read end of pipe
// you don't need to close stdout, dup2() does that.
close(1);//close stdout
if(dup2(piped[1],1) < 0){//duplicate write end with stdout
fprintf(stderr," duplication error \n");
exit(-1);
}
int w=execlp("ls","ls",NULL);
// execlp does not create a new process.
// execlp REPLACES your process.
// Any code below it only runs when exec fails!
close(piped[1]);
if(w<0){
fprintf(stderr,"Something went wrong \n");
exit(-1);
}
wait(NULL);
}
return(0);
}
...and corrections:
Code:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
int main(){
int piped[2];//pipe descriptors
pid_t child;
if(pipe(piped)<0){
fprintf(stderr,"pipe creation failed \n");
exit(-1);
}
if((child = fork()) < 0){
fprintf(stderr,"process creation failed \n");
exit(-1);
}
else if(child == 0){
close(piped[1]);//close the write end of child
if((dup2(piped[0],0)) < 0)
{//duplicate read end with stdin;
fprintf(stderr,"duplication of pipe desc failed \n");
exit(-1);
}
// wc -l will read from fd 0 directly once execlp() replaces
// this child with it. This is because it keeps any open files.
execlp("wc","wc","-l",NULL);
exit(1); // Yes, you need this in case something goes wrong!
}
else{
close(piped[0]);//close read end of pipe
if(dup2(piped[1],1) < 0){//duplicate write end with stdout
fprintf(stderr," duplication error \n");
exit(-1);
}
// ls will feed its output directly into fd 1 once execlp() replaces our process with it.
// This is because exec() keeps the same files open once it's replaced, including pipes, sockets, etc.
int w=execlp("ls","ls",NULL);
if(w < 0) perror("Coudln't execlp"); // perror tells you WHAT went wrong
exit(1);
}
}
Hi,
Could someone help me to get yesterday's date in MMDDYY format.
echo `date '+%m%d%y'`
is giving me today's date in the above format.
Thanks in advance for your help..
Suresh. (1 Reply)
Hi All,
What is the difference with respect to functionality point of view, between HP-UX Release 10.20 and HP-UX Release 11.00?
Does the if condition statement in the shell script behave differently in these two releases? (3 Replies)
I have a few xml files and I want to input say 5 parameters within each file. is it possible to do so with sed?
<parameter>A</parameter>
<parameter>B</parameter>
....
....
And so on.
These parameters are meant to go in just inside:
<?xml... (2 Replies)
Hello,
I am trying to write a script that has a option of restarting the script from where it failed. I have to write a script called Batch.sh. This script has to run quite a few sql files as shown below:
logcmd.sh -f test1.sql
logcmd.sh -f test2.sql
logcmd.sh -f test3.sql
logcmd.sh -f... (4 Replies)
i have a function defined in one ksh
i want to use the same functionality in another ksh
i am using
. ../<ksh name>
but it is not picking that functionality
what i have to do for the same (2 Replies)
here is what i have...
i=1
while read line
do
if grep -i-q "create procedure"<<<$line
then
startline="$line"
endline="blahblah"
Get procedure name into a variable named procName
procName="procedure name is stored"
do some... (2 Replies)
Hi everyone, today i need that someone help to understand this particular line of command.
So you can explain to me step by step, it will be great.
---------- Post updated at 11:53 AM ---------- Previous update was at 11:51 AM ---------- (9 Replies)
Hi guys,
I need to know how i can ignore Pipe '|' if Pipe is coming as a column in Pipe delimited file
for eg:
file 1:
xx|yy|"xyz|zzz"|zzz|12...
using below awk command
awk 'BEGIN {FS=OFS="|" } print $3
i would get xyz
But i want as :
xyz|zzz to consider as whole column... (13 Replies)
Hi ,
I've written the following code to zip the big file
$dir_temp ="/home/etc/hst
zip -r $dir_temp/file_nm.zip $dir_temp/file_nm
The zip file has been created . When I try to UNZIP the file
with the following command
unzip file_nm.zip
The file got unzipped but created in the... (3 Replies)