gpt4 book ai didi

子父进程与管道的进程间通信

转载 作者:行者123 更新时间:2023-11-30 20:28:09 26 4
gpt4 key购买 nike

我试图在 parent 和 child 的沟通中理解。免责声明:以下是我的教授在类里面提供的示例代码,用于理解进程间通信。我的主要弱点是文件描述符。我知道 pipeline(int array[2]) 使 array[0]=fd 作为 std in ,将 array[1] 作为 std out 。但两人之间的沟通如何呢?我对CS还很陌生。谢谢!

/*
* This program demonstrates the use of pipes for interprocess communication.
* The parent process creates a pipe using the "pipe" system call. It then
* creates a child process and passes the child a file descriptor for one side
* of the pipe. It then writes a name to its side of the pipe and waits for the
* child to print a message incorporating the name.
*
* Before you attempt to run this program, be sure you've compiled the program
* named "hw3b.c" and have the executable in a file named "hw3b".
*/

#include <stdlib.h>
#include <strings.h>
#include <stdio.h>

/*
* The name of the file we plan to run. It's here in a define so that we can
* change it easily
*/
#define CHILDPROCNAME "hw3b"

/*
* The behavior of main() is specified by the previous comment
*/

int main(char* argv)
{
// store the ids of the two file descriptors that serve as the pipe
int mypipe[2];

// make the pipe
pipe(mypipe);

// child code:
if (fork() == 0) {
// execv requires us to create a full invocation, consisting of the
// string name of the program to run, a string for each command-line
// argument, and then a null string. We store all that in this array of
// strings
char* myargv[3];

// we use this to turn an int into a string
char buf[50];

// set up the name of the program to run
myargv[0] = calloc(strlen(CHILDPROCNAME) + 1, sizeof(char));
strcpy(myargv[0], CHILDPROCNAME);

// write one of the pipe's fds to the second parameter
sprintf(buf, "%d", mypipe[0]);
myargv[1] = calloc(strlen(buf) + 1, sizeof(char));
strcpy(myargv[1], buf);

// third param is null
myargv[2] = 0;

// switch to child process
execv(CHILDPROCNAME, myargv);

// NB: this should use fprintf and write to stderr
printf("Uh oh, execv didn't work!\n");

// crash on failure
exit(-1);
}

// parent code
else {
// status variable for storing the result of waitpid
int status;

// Send a string across the pipe to the child process
write(mypipe[1], "Kerry", strlen("Kerry"));

// wait for the child process to finish
waitpid(-1, &status, 0);

// NB: we should use status!
}

// close our half of the pipe
close(mypipe[1]);
}

最佳答案

它只是将程序中的childproc 替换为p1。他可能的意思是这取决于值,即 p1

关于子父进程与管道的进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12439924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com