所以对于学校我得到了这个练习,我需要制作一个程序,计算一个数字是否是素数。该程序应该使用父进程和子进程,并且应该使用strtoul将argv转换为unsigned long。
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
void checkprime(unsigned long num);
int main(int argc, char *argv, char *env)
{
strtoul(argv, NULL, 0);
pid_t pid = fork();
if(pid == 0)
{
unsigned long number;
printf("\nGive number to check: \n");
scanf("%lu",&number);
checkprime(number);
}
else if(pid < 0)
{
perror("Fork Failed!");
}
else
{
int status = -1, result;
waitpid(pid, &status, 0);
result = WEXITSTATUS(status);
if(result == 1)
{
printf("this is a prime number\n");
}
else if(status < 0)
{
perror("Something Failed");
}
else
{
printf("this is not a prime number\n");
}
}
return 0;
}
void checkprime(unsigned long num)
{
int i;
for(i = 2; i < num; i++)
{
if(num % i == 0)
{
exit(0);
}
}
exit(1);
}
所以当我尝试编译它时,它说:第13行:标识符不是预期的。错误代码1。
第13行的代码说:pid_t pid = fork();
现在我的问题是:为什么我会收到这个错误?
它已修复,感谢大家的帮助。我很感激。
答案 0 :(得分:2)
某些旧版本的编译器接受C89(不是C99或C11)作为默认C语言。你想要C99(因为你在声明后有声明)。
如果您在某些旧的Linux发行版上使用某些旧版本的GCC,请尝试编译with gcc -std=gnu99 -Wall -Wextra -g
,其中-std=gnu99
设置C方言(您也可以使用{{} 1}}或更好),-std=c99
请求警告,-Wall -Wextra
需要调试信息(在DWARF中为gdb
debugger)。更好的是,将您的GCC升级到最近的版本(如2017年11月的GCC 7),其默认值为C11 GNU extensions。
或者发表声明
-g
(我更喜欢在C中系统地初始化变量)
在陈述之前
pid_t pid= 0;
答案 1 :(得分:0)
编译器告诉您它不希望在该行遇到标识符pid_t
,因为上一行不是标识符。您需要在范围的顶部声明变量,并将其他代码放在其下面。你可以这样做
int main(int argc, char *argv, char *env)
{
long int val=strtoul(argv, NULL, 0);
pid_t pid = fork();
...
或
int main(int argc, char *argv, char *env)
{
pid_t pid = fork();
strtoul(argv, NULL, 0);
...
但是你错过了从strtol
返回的值答案 2 :(得分:0)
您可以通过将i < num
更改为i < num/2
来使用make short prime finder循环。
这是main()
参数的标准之一:
(int argc,char ** argv)
启用gcc标志:-Wall
以查看代码中的所有警告。
正如@cleblanc在其中一个答案中所述,将strtoul()
的返回值存储到变量long int val = strtoul(argv[1], NULL, 0);
。
我们从命令行参数传递数字进行检查,
argv[1]
是指我们使用
./ prime 15
<强> 代码 强>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
void checkprime(unsigned long num);
int main(int argc, char **argv)
{
long int val = strtoul(argv[1], NULL, 0);
pid_t pid = fork();
if(pid == 0){
checkprime(val);
}
else if(pid < 0){
perror("Fork Failed!");
}
else{
int status = -1, result;
waitpid(pid, &status, 0);
result = WEXITSTATUS(status);
if(result == 1){
printf("Prime\n");
}
else if(status < 0){
perror("Something Failed");
}
else{
printf("Not prime\n");
}
}
return 0;
}
void checkprime(unsigned long num)
{
int i;
for(i = 2; i < num/2; i++){
if(num % i == 0){
exit(0);
}
}
exit(1);
}
编译,运行
gcc -Wall prime.c -o prime
./prime 15