Tag: fifo

C命名管道(fifo)。 父进程陷入困境

我想创建一个简单的程序,该fork,并且子进入命名管道,父进程从命名管道读取和显示。 问题是它进入了父进程,进行了第一次printf然后它变得奇怪,它没有做任何其他事情,没有进入第二个printf,它只是在控制台中输入的方式。 #include #include #include #include #include #include #include void main() { char t[100]; mkfifo(“myfifo”,777); pid_t pid; pid = fork(); if (pid==0) { //execl(“fifo2″,”fifo2”,(char*)0); char r[100]; printf(“scrie2->”); scanf(“%s”,r); int fp; fp = open(“myfifo”,O_WRONLY); write(fp,r,99); close(fp); printf(“exit kid \n”); exit(0); } else { wait(0); printf(“entered parent \n”); // <- this it prints // whats below this […]

如何在C中不断读取FIFO

我想在C中不断读取一个fifo管道。我的代码示例有效,但是因为我使用while(1)我的一个CPU核心始终处于100%。 所以我的问题是:有没有更顺畅的方式来读取fifo,而不会杀死CPU? #include #include #include #include #include #include bool suffix (char* base, char* str) { int blen = strlen(base); int slen = strlen(str); return (blen >= slen) && (0 == strcmp(base + blen – slen, str)); } bool prefix(const char *pre, const char *str) { return strncmp(pre, str, strlen(pre)) == 0; } void chomp(char *s) […]

unlink()后从FIFO读取

我创建了一个FIFO,写入并取消链接。 令我惊讶的是,我能够在取消关联后从fifo读取数据,为什么会这样? #include #include #include #include #include #include #define MAX_BUF 256 int main() { int fd; char * myfifo = “/tmp/myfifo”; /* create the FIFO (named pipe) */ mkfifo(myfifo, 0666); int pid = fork(); if (pid != 0) { /* write “Hi” to the FIFO */ fd = open(myfifo, O_WRONLY); write(fd, “Hi”, sizeof(“Hi”)); close(fd); /* […]

使用fifo以非阻塞模式打开并选择

我有两个进程A和B.通信流总是A – > B,但我需要使用命名管道来做,因为我必须在B进程内的select调用中使用管道文件描述符,并写入数据当任何或两个进程退出时,管道必须保持不变。 管道两端以非阻塞模式打开。 在过程A: int push_fifo_fd = open(FIFO_NAME, O_WRONLY | O_NONBLOCK | O_CREAT, 0644); 在流程B中: int fd = open(FIFO_NAME, O_RDONLY | O_NONBLOCK | O_CREAT, 0644); Q1。 进程B使用curl多接口,因此我得到curl多句柄的fd_sets并将“fd”描述符添加到读取fd_set,而不是调用select,以获取可用于读取和写入的文件描述符。 在每次调用select中,“fd”包含在结果读取fd_set中,但read返回0,即使写入结束也是如此。 这导致进程B使用100%的处理器时间。 我提到我不知道订购哪个管子的末端是打开的。 B的相关代码: while (1) { fd_set read_fds, write_fds, err_fds; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&err_fds); FD_SET(fifo_fd, &read_fds); // some code ccode = curl_multi_fdset(curlm, &read_fds, &write_fds, &err_fds, &max_fd); […]

内核OpenCL中FIFO实现的最佳方法

目标:在OpenCL中实现下面显示的图表。 OpenCl内核需要的主要function是将系数数组和临时数组相乘,然后将所有这些值累加到最后。 (这可能是最耗时的操作,并行性在这里真的很有帮助)。 我正在使用内核的辅助函数进行乘法和加法(我希望这个函数也是并行的)。 图片说明: 一次一个 ,将值传递到与系数数组大小相同的数组(临时数组)中。 现在, 每次将单个值传递到此数组时,临时数组将与系数数组并行相乘,然后将每个索引的值连接成一个单独的元素。 这将继续,直到输入数组到达它的最后一个元素。 我的代码怎么了? 对于来自输入的60个元素,它需要超过8000毫秒!! 我总共需要输入120万个输入。我知道有一个更好的解决方案来做我正在尝试的事情。 这是我的代码如下。 以下是我知道他编码肯定是错误的一些事情。 当我尝试将系数值与临时数组相乘时,它会崩溃。 这是因为global_id。 我想要这条线做的只是简单地将两个数组并行。 我试图找出为什么花了这么长时间来执行FIFOfunction,所以我开始评论线路。 我首先开始评论除FIFO函数的第一个for循环之外的所有内容。 结果这耗时50毫秒。 然后,当我取消注释下一个循环时,它跳转到8000毫秒。 因此,延迟将与数据传输有关。 我可以在OpenCl中使用寄存器移位吗? 也许对整数数组使用一些逻辑移位方法? (我知道有一个’>>’运算符)。 float constant temp[58]; float constant tempArrayForShift[58]; float constant multipliedResult[58]; float fifo(float inputValue, float *coefficients, int sizeOfCoeff) { //take array of 58 elements (or same size as number of coefficients) […]

将opencv处理添加到gstreamer应用程序

我正在尝试执行以下操作:使用gstreamer接收video流并使用opencv进行处理。 我找到了一些解决方案,其中一个是将video写入(来自gstreamer)fifo,然后使用opencv读取它。 (OPTION3这里是MJPEG流媒体和解码 )。 问题是我无法打开管道。 cvCreateFileCapture永远不会返回。 这是我写的部分代码: if(mkfifo(“fifo.avi”, S_IRUSR| S_IWUSR) == -1) { cout<<"Cant create fifo"<<endl; cout<<errno<<endl; } loop = g_main_loop_new(NULL, false); fsink = gst_element_factory_make("filesink", "fsink"); g_object_set(G_OBJECT(fsink), "location", "fifo.avi", NULL); playbin = gst_element_factory_make("playbin2", "play"); g_object_set(G_OBJECT(playbin), "uri", uri.c_str(), NULL); g_object_set(G_OBJECT(playbin), "video-sink", fsink, NULL); bus = gst_pipeline_get_bus(GST_PIPELINE(playbin)); gst_bus_add_signal_watch(bus); g_signal_connect(bus, "message::buffering", G_CALLBACK(&set_playbin_state), playbin); gst_object_unref(bus); cvNamedWindow("output", CV_WINDOW_AUTOSIZE); capture = […]