红联Linux门户
Linux帮助

pipe()函数之后的进程执行

发布时间:2010-11-12 15:56:45来源:红联作者:wucongdonglai
对于调用fork()函数之后的进程的实行,我还是搞不懂它是怎么分配的!例子程序如下:
#include
#include
#include
#include
int main()
{
int data_processed;
int file_pipes[2];
const char some_data[] = "123";
char buffer[BUFSIZ + 1]="abd";
pid_t fork_result;
memset(buffer, '\0', sizeof(buffer));
// 下面的if分别测试管道和调用是否成功
if (pipe(file_pipes) == 0) {
fork_result = fork();
if (fork_result == -1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
// 下的if分别测试是父进程还是子进程
if (fork_result == 0) {
data_processed = read(file_pipes[0], buffer, BUFSIZ);
printf("Read %d bytes: %s\n", data_processed, buffer);
exit(EXIT_SUCCESS);
}
else {
sleep(1);
data_processed = write(file_pipes[1], some_data,
strlen(some_data));
printf("Wrote %d bytes\n", data_processed);
}
}
exit(EXIT_SUCCESS);
}
我就不明白了!为什么结果是
Wrote 3 bytes
Read 3 bytes: 123
从这个结果来看,哪怕父进程进入睡眠,也要先执父进程?但是要是把管道相关的东西去掉,如下:
#include
#include
#include
#include
int main()
{
pid_t fork_result;
fork_result = fork();
if (fork_result == -1) {
fprintf(stderr, "Fork failure");
exit(EXIT_FAILURE);
}
if (fork_result == 0) {
printf("Child\n");
exit(EXIT_SUCCESS);
}
else {
sleep(1);
printf("Father\n");
}
exit(EXIT_SUCCESS);
}
这程序的执行结果就是
Child
Father
这才是正常的进程执行!
为什么我调用pipe()后非得先执行父进程了呢?
文章评论

共有 2 条评论

  1. wucongdonglai 于 2010-11-13 09:01:43发表:

    2# 奶茶dsk
    哦,原来是这样的啊,明白了

  2. 奶茶dsk 于 2010-11-12 23:58:44发表:

    子进程read的时候管道无数据可读,阻塞了,直到父进程写入数据子进程才被唤醒,,
    第二个例子是不确定的,看os了,,