⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pipe.c

📁 汇编大全 中国矿业大学计算机学院 汇编实验5
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <process.h>
#include <malloc.h>

#ifdef __EMX__
#define itoa _itoa
#endif

int main (int argc, const char * const *argv)
{
    int ph[2];
    int n, size;
    void *p;
    char buf[80];
    char arg0[34];
    char arg1[34];
    int pid = getpid();

    if (argc > 1 && strcmp(argv[1], "pipe") == 0) {
	ph[0] = atoi(argv[2]);
	ph[1] = atoi(argv[3]);
    } else {
	if (pipe (ph) != 0) {
	    perror ("pipe");
	    return (2);
	}
    }

    printf("pid %d uses pipe handles in=%d out=%d\n", pid, ph[0], ph[1]);

    p = malloc(8192);
    if (p == NULL) {
	puts("error malloc");
	exit(1);
    }

    for (;;) {
	printf("[pid %d]:", pid);
	gets(buf);

	switch (*buf) {
	    case 'w':
		size = atoi(buf+1);
		if (!size || size>8192)
		    break;
		if ((n = write(ph[1], p, size)) < 0)
		    perror("write");
		else
		    printf("pid %d write %d bytes\n", pid, n);
		break;

	    case 'r':
		size = atoi(buf+1);
		if (!size || size>8192)
		    break;
		if ((n = read(ph[0], p, size)) < 0)
		    perror("read");
		else
		    printf("pid %d read %d bytes\n", pid, n);
		break;

	    case 'c':
		n = atoi(buf+1);
		if (n<0 || n>1)
		    break;
		close(ph[n]);
		break;

	    case 's':
		itoa(ph[0], arg0, 10);
		itoa(ph[1], arg1, 10);
		spawnl(P_NOWAIT, argv[0], argv[0], "pipe", arg0, arg1, NULL);
		break;

	    case 'h':
	    case '?':
		puts("w# - write # bytes to pipe");
		puts("r# - read # bytes to pipe");
		puts("c# - close pipe #");
		puts("s  - spawn next program");
		puts("q  - quit");
		break;

	    case 'q':
		exit(0);
	}
    }
    return (0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -