Parent/Child 和 C 中的管道,child-parent 通信
Parent/Child and pipes in C, child-parent comunication
我有一个 parent 程序,它 将一个整数发送到 child,然后 child 程序乘以将数字乘以 2 并返回给 parent。
在主程序中,我创建了一个管道和 fork() 和 execl() child,在切换之后,我通过 pip 将值传递给 child in child i可以获取值,但是 如何在 execl() 之后将结果从 child 返回到 parent?.
child.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
int fd,nread,result;
char data[20];
fd=atoi(argv[1]);
nread=read(fd,data,sizeof(data));
switch(nread)
{
case -1:
break;
default:
result=atoi(data)*2;
sprintf(result,"%d",(result));
//how can here return data to the parent?
break;
}
}
此时在代码中:
//how can here return data to the parent?
插入语句:
return result;
并消除对 sprintf()
的调用
然后在父进程中:
int status;
waitpid( pid, &status );
printf( "%d\n", status );
使用两个管道。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
void xclose(int fd);
void xdup2(int a, int b);
int
main(int argc, char **argv)
{
int p1[2];
int p2[2];
int val = argc > 1 ? strtol(argv[1], NULL, 10) : 1;
char buf[128];
int len;
ssize_t rc;
if(pipe(p1) || pipe(p2)) {
perror("pipe");
return EXIT_FAILURE;
}
switch(fork()) {
case -1:
perror("fork");
return EXIT_FAILURE;
case 0:
xdup2(p1[0],STDIN_FILENO);
xclose(p1[0]);
xclose(p1[1]);
xdup2(p2[1],STDOUT_FILENO);
xclose(p2[0]);
xclose(p2[1]);
execlp("awk", "awk", "{print * 2}", NULL);
perror("exec");
return EXIT_FAILURE;
default:
len = sprintf(buf, "%d", val);
write(p1[1], buf, len);
xclose(p1[1]);
xclose(p1[0]);
xclose(p2[1]);
if(( rc = read(p2[0], buf, sizeof buf)) == -1) {
perror("read");
}
xclose(p2[0]);
buf[rc] = '[=10=]';
printf("%s", buf);
}
return EXIT_SUCCESS;
}
void
xclose(int fd) {
if(close(fd)) {
perror("close");
exit(EXIT_FAILURE);
}
}
void
xdup2(int a, int b) {
if(dup2(a,b) == -1) {
perror("dup2");
exit(EXIT_FAILURE);
}
}
我有一个 parent 程序,它 将一个整数发送到 child,然后 child 程序乘以将数字乘以 2 并返回给 parent。
在主程序中,我创建了一个管道和 fork() 和 execl() child,在切换之后,我通过 pip 将值传递给 child in child i可以获取值,但是 如何在 execl() 之后将结果从 child 返回到 parent?.
child.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
int fd,nread,result;
char data[20];
fd=atoi(argv[1]);
nread=read(fd,data,sizeof(data));
switch(nread)
{
case -1:
break;
default:
result=atoi(data)*2;
sprintf(result,"%d",(result));
//how can here return data to the parent?
break;
}
}
此时在代码中:
//how can here return data to the parent?
插入语句:
return result;
并消除对 sprintf()
然后在父进程中:
int status;
waitpid( pid, &status );
printf( "%d\n", status );
使用两个管道。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
void xclose(int fd);
void xdup2(int a, int b);
int
main(int argc, char **argv)
{
int p1[2];
int p2[2];
int val = argc > 1 ? strtol(argv[1], NULL, 10) : 1;
char buf[128];
int len;
ssize_t rc;
if(pipe(p1) || pipe(p2)) {
perror("pipe");
return EXIT_FAILURE;
}
switch(fork()) {
case -1:
perror("fork");
return EXIT_FAILURE;
case 0:
xdup2(p1[0],STDIN_FILENO);
xclose(p1[0]);
xclose(p1[1]);
xdup2(p2[1],STDOUT_FILENO);
xclose(p2[0]);
xclose(p2[1]);
execlp("awk", "awk", "{print * 2}", NULL);
perror("exec");
return EXIT_FAILURE;
default:
len = sprintf(buf, "%d", val);
write(p1[1], buf, len);
xclose(p1[1]);
xclose(p1[0]);
xclose(p2[1]);
if(( rc = read(p2[0], buf, sizeof buf)) == -1) {
perror("read");
}
xclose(p2[0]);
buf[rc] = '[=10=]';
printf("%s", buf);
}
return EXIT_SUCCESS;
}
void
xclose(int fd) {
if(close(fd)) {
perror("close");
exit(EXIT_FAILURE);
}
}
void
xdup2(int a, int b) {
if(dup2(a,b) == -1) {
perror("dup2");
exit(EXIT_FAILURE);
}
}