On Fri, 10 Jul 2009 08:22:54 +0200, Ardhan Madras <nightdecoder@xxxxxxxxx>
wrote:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
pid_t pid;
int fds[2], ret;
const char *sort = "/usr/bin/sort";
"static const char sort[]" would be better IMO.
char *argv[2] = { "sort", NULL };
"static const char *argv[]" is definitly better here and does not produce
warnings. Your code discards "const" from pointer (a string literal).
ret = pipe(fds);
if (ret == -1) {
perror("pipe");
return -1;
}
pid = fork();
if (pid == -1) {
perror("fork");
return -1;
}
Personally I preffer something like:
switch (fork()) {
case -1: /* error */ break;
case 0: /* child */ break;
default: /* parent */
}
but suit yourself.
if (pid == 0) {
int ret;
No need to define this variable here. You already have such variable.
close(fds[1]);
dup2(fds[0], STDIN_FILENO);
ret = execve(sort, argv, NULL);
if (ret == -1) {
perror("execve");
}
close(fds[0]);
_exit(0);
No need to close(), and _exit(0) should be _exit(1) (or -1 if you will)
since the chiled finished with error.
}
else {
FILE *stream;
close(fds[0]);
stream = fdopen(fds[1], "w");
if (!stream) {
perror("fdopen");
return -1;
}
fprintf(stream, "this\n");
fprintf(stream, "means\n");
fprintf(stream, "war\n");
fflush(stream);
And here, replace fflush() with fclose(). It seems, data is buffered on
kernel level, not only libc level and fflush() cannot handle that.
waitpid(pid, &ret, 0);
close(fds[1]);
No need to close.
}
return 0;
}
--
Best regards, _ _
.o. | Liege of Serenly Enlightened Majesty of o' \,=./ `o
..o | Computer Science, Michał "mina86" Nazarewicz (o o)
ooo +-<m.nazarewicz@xxxxxxxxxxx>-<mina86@xxxxxxxxxx>-ooO--(_)--Ooo--
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html