Ich verstehe nicht, wie man das Erschaffene benutzt pipe
von mp.c im child process
sp.c. Ich (glaube ich) kann scheinbar nicht richtig zugreifen file descriptor
beim Benutzen execl
für den Außenprozess.
/***************mp.c*****************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *procpath = "/mypath/sp";
char *procname = "sp";
pid_t pid;
int fd[2];
int ret;
char buf[20];
memset(&buf[0], 0, sizeof(buf));
ret = pipe(fd);
if(ret == -1){
perror("pipe");
exit(1);
}
pid = fork();
printf("%dn",pid);
if (pid == 0){
//dup2(mypipefd[1],STDOUT_FILENO);
ret = execl(procpath, procpath, "1","2",NULL);
perror("execl failed to run slave program");
exit(1);
}
else if (pid > 0){
/* Parent process*/
printf("execl ret val = %d",ret);
printf("Parent process n");
close(fd[1]);
read(fd[0],buf,15);
// close(fd[1]);
close(fd[0]);
printf("buf: %s TESTn", buf);
printf("buf: %s TESTn", buf);
}
else{
printf("call to fork failed, no childn");
exit(-1);
}
exit(0);
}
und der erstellte Prozess ...
/***************sp.c*****************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[]){
int ret;
//printf("Child process n");
int fd[2];
pipe(fd);
//dup2(fd[1],1);
//int out;
/*ret = dup2(fd[1],1);
if (ret = -1){
printf("%sn", strerror(errno));
};*/
//sprintf()
//printf("%dn", ret);
//mypipefd = argv[1];
printf("Child process n");
//close(fd[0]);
write(fd[1], "Hello there!",12);
close(fd[1]);
exit(0);
}
Antworten:
0 für die Antwort № 1Das Problem ist, dass Sie ein anderes erstellenRohr in jeder Anwendung. Um über eine Pipe korrekt zu kommunizieren, sollten sich zwei Programme dieselbe Pipe teilen (eines der von der Pipe-Funktion erzeugten Dateideskriptoren).
Um dieses Problem zu lösen, müssen Sie im Grunde erstellendie Pipe in einer Anwendung und senden Sie die Dateideskriptor an das andere Programm, ohne die Systemaufrufpipe erneut aufzurufen. Ein Dateideskriptor kann mithilfe einer Socket-Unix-Domäne an einen anderen Prozess gesendet werden. Schau dir diesen Beitrag an Kann ich eine Dateibeschreibung für einen anderen Prozess unter Linux freigeben oder sind sie lokal für den Prozess?.