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

📄 tclunixtest.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
	} else {	    mask = TCL_WRITABLE;	    file = pipePtr->writeFile;	}	if (Tcl_GetInt(interp, argv[4], &timeout) != TCL_OK) {	    return TCL_ERROR;	}	i = TclUnixWaitForFile(GetFd(file), mask, timeout);	if (i & TCL_READABLE) {	    Tcl_AppendElement(interp, "readable");	}	if (i & TCL_WRITABLE) {	    Tcl_AppendElement(interp, "writable");	}    } else if (strcmp(argv[1], "windowevent") == 0) {	Tcl_DoOneEvent(TCL_WINDOW_EVENTS|TCL_DONT_WAIT);    } else {	Tcl_AppendResult(interp, "bad option \"", argv[1],		"\": must be close, clear, counts, create, empty, fill, ",		"fillpartial, oneevent, wait, or windowevent",		(char *) NULL);	return TCL_ERROR;    }    return TCL_OK;}static void TestFileHandlerProc(clientData, mask)    ClientData clientData;	/* Points to a Pipe structure. */    int mask;			/* Indicates which events happened:				 * TCL_READABLE or TCL_WRITABLE. */{    Pipe *pipePtr = (Pipe *) clientData;    if (mask & TCL_READABLE) {	pipePtr->readCount++;    }    if (mask & TCL_WRITABLE) {	pipePtr->writeCount++;    }}/* *---------------------------------------------------------------------- * * TestfilewaitCmd -- * *	This procedure implements the "testfilewait" command. It is *	used to test TclUnixWaitForFile. * * Results: *	A standard Tcl result. * * Side effects: *	None. * *---------------------------------------------------------------------- */static intTestfilewaitCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    int mask, result, timeout;    Tcl_Channel channel;    int fd;    ClientData data;    if (argc != 4) {	Tcl_AppendResult(interp, "wrong # arguments: should be \"", argv[0],		" file readable|writable|both timeout\"", (char *) NULL);	return TCL_ERROR;    }    channel = Tcl_GetChannel(interp, argv[1], NULL);    if (channel == NULL) {	return TCL_ERROR;    }    if (strcmp(argv[2], "readable") == 0) {	mask = TCL_READABLE;    } else if (strcmp(argv[2], "writable") == 0){	mask = TCL_WRITABLE;    } else if (strcmp(argv[2], "both") == 0){	mask = TCL_WRITABLE|TCL_READABLE;    } else {	Tcl_AppendResult(interp, "bad argument \"", argv[2],		"\": must be readable, writable, or both", (char *) NULL);	return TCL_ERROR;    }    if (Tcl_GetChannelHandle(channel, 	    (mask & TCL_READABLE) ? TCL_READABLE : TCL_WRITABLE,	    (ClientData*) &data) != TCL_OK) {	Tcl_SetResult(interp, "couldn't get channel file", TCL_STATIC);	return TCL_ERROR;    }    fd = (int) data;    if (Tcl_GetInt(interp, argv[3], &timeout) != TCL_OK) {	return TCL_ERROR;    }    result = TclUnixWaitForFile(fd, mask, timeout);    if (result & TCL_READABLE) {	Tcl_AppendElement(interp, "readable");    }    if (result & TCL_WRITABLE) {	Tcl_AppendElement(interp, "writable");    }    return TCL_OK;}/* *---------------------------------------------------------------------- * * TestfindexecutableCmd -- * *	This procedure implements the "testfindexecutable" command. It is *	used to test Tcl_FindExecutable. * * Results: *	A standard Tcl result. * * Side effects: *	None. * *---------------------------------------------------------------------- */static intTestfindexecutableCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    char *oldName;    if (argc != 2) {	Tcl_AppendResult(interp, "wrong # arguments: should be \"", argv[0],		" argv0\"", (char *) NULL);	return TCL_ERROR;    }    oldName = tclExecutableName;    tclExecutableName = NULL;    Tcl_FindExecutable(argv[1]);    if (tclExecutableName != NULL) {	Tcl_SetResult(interp, tclExecutableName, TCL_VOLATILE);	ckfree(tclExecutableName);    }    tclExecutableName = oldName;    return TCL_OK;}/* *---------------------------------------------------------------------- * * TestgetopenfileCmd -- * *	This procedure implements the "testgetopenfile" command. It is *	used to get a FILE * value from a registered channel. * * Results: *	A standard Tcl result. * * Side effects: *	None. * *---------------------------------------------------------------------- */static intTestgetopenfileCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    ClientData filePtr;    if (argc != 3) {        Tcl_AppendResult(interp,                "wrong # args: should be \"", argv[0],                " channelName forWriting\"",                (char *) NULL);        return TCL_ERROR;    }    if (Tcl_GetOpenFile(interp, argv[1], atoi(argv[2]), 1, &filePtr)            == TCL_ERROR) {        return TCL_ERROR;    }    if (filePtr == (ClientData) NULL) {        Tcl_AppendResult(interp,                "Tcl_GetOpenFile succeeded but FILE * NULL!", (char *) NULL);        return TCL_ERROR;    }    return TCL_OK;}/* *---------------------------------------------------------------------- * TestalarmCmd -- * *	Test that EINTR is handled correctly by generating and *	handling a signal.  This requires using the SA_RESTART *	flag when registering the signal handler. * * Results: *	None. * * Side Effects: *	Sets up an signal and async handlers. * *---------------------------------------------------------------------- */intTestalarmCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{#ifdef SA_RESTART    unsigned int sec;    struct sigaction action;    if (argc > 1) {	Tcl_GetInt(interp, argv[1], (int *)&sec);    } else {	sec = 1;    }    /*     * Setup the signal handling that automatically retries     * any interupted I/O system calls.     */    action.sa_handler = AlarmHandler;    memset((void *)&action.sa_mask, 0, sizeof(sigset_t));    action.sa_flags = SA_RESTART;    if (sigaction(SIGALRM, &action, NULL) < 0) {	Tcl_AppendResult(interp, "sigaction: ", Tcl_PosixError(interp), NULL);	return TCL_ERROR;    }    if (alarm(sec) < 0) {	Tcl_AppendResult(interp, "alarm: ", Tcl_PosixError(interp), NULL);	return TCL_ERROR;    }    return TCL_OK;#else    Tcl_AppendResult(interp, "warning: sigaction SA_RESTART not support on this platform", NULL);    return TCL_ERROR;#endif}/* *---------------------------------------------------------------------- * * AlarmHandler -- * *	Signal handler for the alarm command. * * Results: *	None. * * Side effects: * 	Calls the Tcl Async handler. * *---------------------------------------------------------------------- */static voidAlarmHandler(){    gotsig = "1";}/* *---------------------------------------------------------------------- * TestgotsigCmd -- * * 	Verify the signal was handled after the testalarm command. * * Results: *	None. * * Side Effects: *	Resets the value of gotsig back to '0'. * *---------------------------------------------------------------------- */intTestgotsigCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Not used. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    Tcl_AppendResult(interp, gotsig, (char *) NULL);    gotsig = "0";    return TCL_OK;}

⌨️ 快捷键说明

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