Tag: posix

使用Unix和C / C ++帮助阻止套接字

我正在试图弄清楚什么阻碍了我的程序。 我正在运行使用POSIX线程的服务器。 我必须为我的计算机编程实验室。 main函数侦听新连接。 一旦接受连接,它就会通过将FD传递给线程来创建新线程。 我能够使用多个telnet /客户端连接成功连接到服务器。 我可以成功地将数据发送到服务器一次,但如果我再次尝试发送,服务器将不会执行任何操作。 部分主要function int active_thread = 0; //The Running loop while(running) { if(active_thread > NUMBTHREADS) { printf(“Unable to accept client connection! Threads are all used up”); running = false; } else { if(FD_ISSET(sockfd, &readfds)) { if((bindfd[active_thread] = accept(sockfd, (struct sockaddr *) &client_addr, &client_sock_size)) == -1) { fprintf(stderr, “Unable to […]

getrusage()如何报告hibernate时间?

我目前正在使用getrusage告诉我在应用程序的事件循环中花了多少时间。 我想知道这会如何受到冬眠的影响。 是否报告了hibernate时间? 或者也许是系统时间? 这是在Posix的某处指定的还是这个系统依赖的? 编辑在这里向Windows提出同样的问题。

如何从主线程唤醒睡眠线程?

我有一个捕获程序,此外捕获数据并将其写入文件还打印一些统计信息。打印统计信息的function static void report(void) { /*Print statistics*/ } 使用每秒过期的ALARM大致每秒调用一次。所以程序就像 void capture_program() { pthread_t report_thread while() { if(pthread_create(&report_thread,NULL,report,NULL)){ fprintf(stderr,”Error creating reporting thread! \n”); } /* Capturing code ————– ————– */ if(doreport) /*wakeup the sleeping thread.*/ } } void *report(void *param) { //access some register from hardware //sleep for a second } 计时器到期时设置doreport标志。如果设置了此标志,则调用report()来清除该标志。 当计时器在主线程中关闭时,如何唤醒睡眠线程(运行report())?

我是否可以通过一个进程中的PTE指示物理内存碎片在其他进程中创建适当的PTE?

当我们在Linux中使用函数mmap (,,, MAP_ANON | MAP_SHARED); 然后,对于进程之间的碎片物理内存(分配)的相同区域,分配虚拟内存页(PTE)。 即这些PTE从一个进程的页表复制到另一个进程的页表(具有相同的物理地址分配内存片段序列),这是真的吗? 但是mmap ()需要在fork ()之前完成。 如果我们已经有两个工作进程(即fork () ),那么我们需要为mmap()使用一个文件 。 哪两个函数用于复制两个已经建立的进程之间的PTE机制来创建共享内存? 我可以使用PTE / SGL(分散 – 收集列表)指示已经分配的物理内存片段,通过使用linux-kernel在其他进程中创建适当的PTE,以及如何做到这一点? 我想了解mmap()在较低级别的工作原理。

通过C程序更改环境变量

任何人都知道如何通过C程序更改Linux环境变量? 我不想更改为执行该程序而复制的环境变量。 我希望能够从C程序更改其值,然后在linux中执行命令’env’时,我可以看到它的值已更改。 有小费吗?

无限管疯狂

我正在尝试创建一组infinte管道,以便从左边的流程遍历到正确的流程。 我正在使用fd保留前面的fd并将其输入到新进程。 任何人都可以看到我出错的地方。 在这一点上看起来应该很简单。 我记录得很好。 //Keep the previous out fd for the in of the subsequent process int prev_out_fd; for (x = 0; x < prog_count; ++x) { //Create a pipe for both processes to share int pipefd[2]; if (x != prog_count -1) { pipe(pipefd); } prog_defs[x].pid = fork(); if(prog_defs[x].pid == 0) { //If this […]

C – stdin缓冲区中已有数据时,在stdin上选择()

select函数阻止调用进程,直到在任何指定的文件描述符集上存在活动[…]如果读取调用不会阻塞,则认为文件描述符已准备好进行读取。 (参见: https : //www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO.html ) 所以我预计,如果你在第一次迭代中输入一个> 4个字符的字符串,那么在下面的程序中选择将立即返回第二个…迭代。 但事实并非如此。 在第一次输出后按任何其他键之后,它继续处理所有剩余的输入。 为什么? 样本输出: ./selectTest 12345678900 Keyboard input received: 1234 A Keyboard input received: 5678 Keyboard input received: 900 Keyboard input received: A 码 #include #include #include #include int main(void) { fd_set rfds; char buf[100]; while(1) { FD_ZERO(&rfds); FD_SET(fileno(stdin), &rfds); if(-1 == select(FD_SETSIZE, &rfds, NULL, NULL, NULL)) […]

如何在Linux上使用C执行期间切换用户

我在Linux上使用C编写应用程序。 在我的应用程序中,我需要在开始时使用普通用户(非root用户)执行一些任务,同时我还需要在执行过程中与root用户执行一些任务。 顺便说一句,我无法修改普通用户的配置。 所以我无法将普通用户添加到sudoers。 我也无法修改任何操作系统配置。 我的应用程序真正做的是执行应用程序,获取其输出以进行分析。 某些应用程序需要使用root运行。 我使用multithreading并行执行和分析这些应用程序的输出,然后将每个应用程序的报告存储在一个名为Report的单例中。 我在子进程中使用execvp来调用这些应用程序。 我的应用程序的主要目的是自动化软件测试。 并且大多数任务都需要在不属于root的软件所有者中运行。 所以,问题是 如何在执行期间切换用户? 反正我是否可以在1个可执行文件中实现它? 使用POSIX API执行此操作会更好。 使用普通用户运行我的应用程序,为我的应用程序提供root密码,使用root密码切换到root。

sem_timedwait()pthreads-win32 errno用法

我在Win32应用程序上使用pthreads-win32作为线程。 我正在使用此处发布的第一个函数计算timespec。 对sem_timedwait()的调用似乎在等待指定的ts时间,但是每次完成时我都会得到以下消息: 等待信号量时出错:没有错误 我在这里检查了sem_timedwait.c的文件,它们指定了相同的errno值和返回值。 因此,我不知道为什么它会退出这个错误,并想知道原因。 #ifdef _WIN32 #define HAVE_STRUCT_TIMESPEC #endif // _WIN32 #include #include #include #include #include #include #include #include #include “include.h” // Platform includes #ifdef _WIN32 #include #include #else #include #include #include #include #include #include #endif // _WIN32 // … sem_init(&job_semaphore, 0, 0); // … // Set wait time relative to current time […]

使用线程,我应该如何处理理想情况下按顺序发生的事情?

我有一个图像生成器,可以从线程运行中受益。 我打算使用POSIX线程,并编写了一些基于https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal的模拟代码来测试。 在预期的程序中,当使用GUI时,我希望生成的行逐个从上到下显示(图像生成可能非常慢)。 还应注意,线程中生成的数据不是实际的图像数据。 读取线程数据并将其转换为RGB数据并放入实际的图像缓冲区中。 并且在GUI内,可以在图像生成期间改变线程生成的数据被转换为RGB数据的方式而不停止图像生成。 但是,线程调度程序无法保证线程将以我想要的顺序运行,这不幸地使得线程生成的数据的转换更加棘手,这意味着保持数组保持bool值以指示哪些行的不合需要的解决方案完成。 我应该怎么处理这个? 目前我有一个观察者线程来报告图像何时完成(实际上应该是一个进度条,但我还没有那么远,它使用pthread_cond_wait )。 和几个渲染线程一起做while(next_line()); next_line()执行互斥锁定,并在递增它并解锁互斥锁之前获取img_next_line的值。 它然后呈现该行并执行互斥锁(与第一个不同)以获得line_done对高度的检查,如果完成则发出信号,解锁并在完成时返回0或如果不完成则返回1。