我在使用client.c
读取用户提供的信息(2个整数和字符"+"
或"-"
)的程序时遇到问题。然后使用execl
系统调用,client.c
将用户输入发送到server.c
,其中计算两个整数之和或差。最后,结果将通过client.c
系统调用传输到exit
,client.c
将打印该结果。
我面临的问题是,我没有得到我期望的结果(它总是打印0),我无法弄清楚原因。
client.c
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXLINE 1024
int main(int argc, char **argv)
{
char buf1[MAXLINE];
char buf2[MAXLINE];
char buf3[MAXLINE];
int childPid;
pid_t pid;
int status;
int x,i,j,n;
char c;
x=1;
n=0;
while(x<=3){
printf(">");
if(x==1){
fgets(buf1, MAXLINE, stdin);
if(sscanf(buf1,"%i",&i)!=1){
perror("eroare la citire i");
}}
if(x==2){
fgets(buf2, MAXLINE, stdin);
if(sscanf(buf2,"%i",&j)!=1){
perror("eroare la citire j");}}
if(x==3){
fgets(buf3, MAXLINE, stdin);
if(sscanf(buf3,"%c",&c)!=1){
perror("eroare la citire c");}}
x++;
}
if ((pid=fork()) < 0) {
perror("Eroare fork");
exit(1);
}
else if (pid == 0) {
n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2",buf1,buf2,buf3,NULL);
wait(&status);
}
printf("%d" ,status);
}
server.c
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(int arc,char **argv)
{
int x,y,result;
char c;
if(sscanf(argv[1],"%i",&x)!=1){
perror("eroare la citirea primului argument");
}
if(sscanf(argv[2],"%i",&y)!=1){
perror("eroare la citirea celui de-al argument");
}
if(sscanf(argv[3],"%c",&c)!=1){
perror("eroare la citirea celui de-al treilea argument");
}
if(c=='+')
result=x+y;
if(c=='-')
result=x-y;
printf("%d",result);
exit(result);
}
答案 0 :(得分:3)
您使用错误的参数数量调用execl
。
来自execl
man
:
execl(),execlp()中的const char * arg和后续省略号, 和execle()函数可以被认为是arg0,arg1,...,argn。 他们一起描述了一个或多个指针的列表 以null结尾的字符串,表示可用的参数列表 执行的程序。 按照惯例,第一个论点应该指出 与正在执行的文件关联的文件名。 列表 参数必须由NULL指针终止,因为它们是 可变参数函数,必须将此指针强制转换为(char *)NULL。
除了传递可执行文件的路径外,参数列表还应以正在执行的文件的名称开头。来电将采用execl("/path", "filename", "arg1", "arg2", ...)
而不是:
n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2",buf1,buf2,buf3,NULL);
应该是:
n=execl("/home/mihaelavasiu/so/SO-lab6/Problem1_2/bin/Debug/Porblem1_2","Porblem1_2",buf1,buf2,buf3,NULL);
请注意"Porblem1_2"
是在它的路径后面给出的。
此外,您使用wait
传递“结果”的方式将无法按照我认为的方式运行,与status >> 8
进行位移。