分析下列代码void tprogress(L while(1) sleep(1);printf(".");fflush(stdout); return NULL:
时间: 2023-08-02 11:05:41 浏览: 85
这段代码中有语法错误和逻辑问题。下面是修正后的代码:
```
void* tprogress(void* arg) {
while(1) {
sleep(1);
printf(".");
fflush(stdout);
}
return NULL;
}
```
该函数是一个线程函数,用于输出进度条。其实现的主要步骤是:
1. 进入一个无限循环。
2. 每隔 1 秒钟输出一个点号,然后刷新输出缓冲区。
3. 循环执行,直到函数被调用的线程被取消。
需要注意的是,该函数没有任何线程同步机制,可能会出现输出缓冲区的竞争问题。此外,该函数没有任何退出机制,只能通过取消线程来终止循环。
相关问题
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #define BUF_SIZE 26 int pipefd[2]; void sig_alrm(int signo){ char buf[BUF_SIZE]; int cnt = 0; printf("pid: %d, sig=%d ", getpid(), signo); for (char c = 'a'; c <= 'z'; c++) buf[cnt++] = c; write(pipefd[1], buf, cnt); printf("pid: %d, send %d bytes ", getpid(), cnt); } void sig_int(int signo){ printf("pid: %d, sig=%d ", getpid(), signo); signal(SIGINT, SIG_DFL); alarm(2); } int main(){ pid_t pid; char buf[BUF_SIZE]; int cnt = 0; if (pipe(pipefd) < 0) { perror("pipe error"); exit(EXIT_FAILURE); } if ((pid = fork()) < 0) { perror("fork error"); exit(EXIT_FAILURE); } else if (pid == 0) { signal(SIGALRM, sig_alrm); signal(SIGINT, sig_int); alarm(2); while (1) { printf("...child is waiting "); fflush(stdout); sleep(1); } } else { printf("parent pid: %d ", getpid()); fflush(stdout); close(pipefd[1]); while (1) { int n = read(pipefd[0], buf, 8); if (n <= 0) break; cnt += n; printf("receive %d bytes, %s ",n, buf); fflush(stdout); } printf("pid: %d, send SIGINT ", getpid()); fflush(stdout); kill(pid, SIGINT); sleep(1); printf("pid: %d, send SIGINT again ", getpid()); fflush(stdout); kill(pid, SIGINT); sleep(1); wait(NULL); printf("...child is waiting "); fflush(stdout); exit(EXIT_SUCCESS); } return 0; } 为什么该代码运行结果最后一次两个字符却取了八个字符,并且...child is waiting一直循环不止,该如何更改代码才能得到parentpid:221...childiswaiting...childiswaitingpid:222,sig=14send26bytesreceive8bytes,abcdefgh...childiswaitingreceive8bytes,ijklmnopreceive8bytes,qrstuvwxreceive2bytes,yzpid:222,sig=2...childiswaiting的运行结果。
该代码最后一次取了8个字符,是因为管道的缓冲区大小为8,所以最后一次读取时只能读取到8个字符。而循环的问题是因为子进程一直在等待,而父进程没有杀死子进程导致的。可以在父进程中加上kill命令杀死子进程来解决这个问题。同时,在子进程中,可以在sig_int信号处理函数中加上kill命令杀死子进程来确保子进程会被杀死。修改后的代码如下:
#include<stdio.h> #include<pthread.h> #include<unistd.h> void *deal_fun01(void *arg) { char *str = (char *)arg; int i = 0; while (str[i] != '\0') { printf("%c",str[i++]); fflush(stdout); sleep(1); } return NULL; } void *deal_fun02(void *arg) { char *str = (char *)arg; int i = 0; while (str[i] != '\0') { printf("%c",str[i++]); fflush(stdout); sleep(1); } return NULL; } int main(int argc,char const *argv[]) { pthread_t tid1,tid2; pthread_create(&tid1,NULL,deal_fun01,"hello"); pthread_create(&tid2,NULL,deal_fun02,"world"); pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0; }
这段代码使用了多线程技术,创建了两个线程分别输出 "hello" 和 "world"。具体解释如下:
1. 引入需要的头文件:stdio.h、pthread.h、unistd.h。
2. 定义两个线程处理函数 deal_fun01 和 deal_fun02,函数参数为 void* 类型的指针,指向一个字符串。
3. 使用 pthread_create() 函数创建线程,参数依次为:
- 线程 ID,类型为 pthread_t。
- 线程属性,通常为 NULL 表示使用默认属性。
- 线程处理函数的地址。
- 线程处理函数的参数。
4. 在主函数中使用 pthread_join() 函数等待线程结束,参数依次为:
- 线程 ID。
- 用于获取线程返回值的指针,通常为 NULL 表示不关心返回值。
5. 程序最后返回 0。
需要注意的是,printf() 函数和 fflush() 函数的作用是为了保证输出的字符不会被缓存而导致输出不及时。sleep() 函数的作用是为了控制每个字符输出的时间间隔。
阅读全文